导语:此文章主要记述几种设计模式的定义、类图与设计原则,需要此前对设计模式有一定了解,详细可以阅读《head frist 设计模式》,若想一起讨论、学习,请加QQ群:518105162
一、策略模式:
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
策略模式
设计原则:
- 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
- 针对接口编程,而不是针对实现编程。
- 多用组合,少用继承。
二、观察者模式
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
观察者模式
设计原则:
- 为了交互对象之间的松耦合设计而努力。
三、装饰者模式
动态地将责任附加到对象上。如要扩展功能,装饰者提供了比继承更有弹性的替代方案。
装饰者模式定义类图
星巴兹咖啡销售系统装饰者模式类图关系:
装饰者模式四、工厂模式:
简单工厂:
- 建立一个简单工厂
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
Pizza pizza = null;
if (type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("pepperoni")) {
pizza = new PepperoniPizza();
} else if (type.equals("clam")) {
pizza = new ClamPizza();
} else if (type.equals("veggie")) {
pizza = new VeggiePizza();
}
return pizza;
}
}
- 将生产披萨的任务委托给这个工厂
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = factory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
工厂方法模式:
工厂方法模式定义类图定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
披萨店关系类图:
-
创建者类:
工厂方法模式 - 产品类:
抽象工厂模式:
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
设计原则:
- 要依赖抽象,不要依赖具体类。
这个原则告诉我们,应该重写代码以便于我们依赖抽象类,而不是依赖具体类。对于高层及低层模块都应该如此。
五、单例模式(单件模式)
确保一个类只有一个实例,并提供一个全局访问点。
单例模式
- 懒加载单例:
public class Singleton {
private static Singleton uniqueInstance;
// other useful instance variables here
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// other useful methods here
public String getDescription() {
return "I'm a thread safe Singleton!";
}
}
- 急加载单例:
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return uniqueInstance;
}
// other useful methods here
public String getDescription() {
return "I'm a statically initialized Singleton!";
}
}
如果不做处理的话,急加载单例比懒加载更加线程安全,但是如果懒加载使用synchronized“锁住”getInstance方法的话,就会变成线程安全的单例。但是这两种线程安全的方式都降低了程序性能,可以在使用懒加载时给uniqueInstance字段加volatile关键字以提高程序执行性能。
六、命令模式
将请求封装成对象,这可以让你使用不同的请求、队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。
七、适配器模式
适配器(adapter-pattern):将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
- 对象适配器(组合)
- 类适配器(多重继承):在Java中不能实现
外观模式(facade-pattern):提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
要点:
- 当需要使用一个现有的类而其接口不符合需要时,使用适配器。适配器改变接口以符合客户期望。
- 当需要简化并统一一个很大的接口或一群复杂的接口时,使用外观。外观将客户从一个复杂的子系统中解耦。
-
适配器与装饰者的区别:适配器将一个对象包装起来以改变接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化接口。
适配器类图
十一、代理模式
代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。
- 使用java RMI
RMI提供了客户辅助对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法。
制作远程服务的步骤:
步骤一:制作远程接口
步骤二:制作远程的实现
步骤三:利用rmic产生的stub和skelton。
步骤四:启动RMIregistry(rmiregisry)
步骤五:开始远程服务
结语:
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【喜欢】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
网友评论