1、策略模式:定义算法族,并将其封装,让它们之间可以互换,让算法的变化独立与使用算法的客户中
应用到的原则: a、找出应用中需要改变的地方,独立出来并封装好
b、针对接口编程不是针对实现编程。(针对接口编程关键就在多态,Parent parent=new Child()就是针对接口编程,但是从某种程度上说new一个对象也是针对实现编程)
C、多用组合(has-a)少用继承(is-a).组合的实现方法:一个类中包含另一个类的引用,或者一个类的引用另一个类的方法的参数)
书中例子(head first):由于Duck有各种类型,可以飞的,可以叫的,于是就将飞和叫做为两个接口,独立于Duck类,设计为两个接口FlyBehavior和QuackBehavior,其中具体怎么飞,怎么叫,设计相应的类继承FlyBehavior和QuackBehavior接口,完成相应的功能,这就完成了算法的封装。在Duck类中定义FlyBehavior和QuackBehavior的引用,实现多态。
2、装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案
应用到的原则:类应该对扩展开放,对修改关闭。(在设计中我们应该能扩展现有的功能,而无需修改现有的代码)
书中例子:装饰者模式一般包含:抽象组件(beverage),具体组件(espresso),抽象装饰者(condimentDecorator),具体描述者(mocka).在书中的抽象装饰者只是提供了一个抽象的getDescription()方法,其中Mocha等具体的装饰者改写getDescription()方法,在每一个具体的装饰者中都有抽象组件beverage的引用
其中java的I/O流用到了这种设计模式:以socket为例:BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
3、工厂模式:定义了创建对象的接口,但由子类决定要实例化的类是哪一个,工厂模式将实例化推迟到子类
简单工程模式:从实际意义上来说他不是一个工厂模式,但是能完成一定的功能。
定义了三个类PizzaStore,SimplePizzaFactory,Pizza,其中Pizza是抽象接口,还有他的一些子类。SimplePizzaFactory中有一个createPizza(String type)方法,用于创造具体的Pizza,同时PizzaStore中有一个orderPizza(String type)方法,PizzaStore中有一个SimplePizzaFactory,用于引入一个工厂。
代码为:
public class PizzaStore{
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory){
this.factory=factory;
}
..........
}
工厂模式:在简单模式上做出小的改变,将PizzaStore定义为抽象接口,同时将createPizza(String type)移到PizzaStore中,定义为抽象
public abstract class PizzaStore {
public Pizza orderPizza(String type){
Pizza pizza;
pizza=createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
abstract Pizza createPizza(String type);//创建对象的接口,将对象的创建推迟到子类,就相当与一个工厂
}
抽象工厂:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体的类
其实抽向工厂提供了一个更大的接口(AbstractFactory),有很多具体的工厂实现该接口(PizzaFactory),然后每个具体的工厂又像工厂模式一样工作。但是这些具体工厂生产的产品都有一定的关系。