常见设计模式快速记忆

1:装饰模式

 

说明:Component是接口,ConcreteComponent是其实现类,Decorator是装饰器抽象类(包含了一个private的Component属性)

看类图,Component是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象,比如上面的成绩单,记住在装饰模式中,必然有一个被提取出来最核心、最原始、最基本的接口或抽象类,就是Component。
ConcreteComponent这个事最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是这个东东。
Decorator一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个private变量指向Component。
ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,你要把你最核心的、最原始的、最基本的东西装饰城啥东西,上面的例子就是把一个比较平庸的成绩单装饰成家长认可的成绩单。
装饰模式是对继承的有力补充,你要知道继承可不是万能的,继承可以解决实际的问题,但是在项目中你要考虑诸如易维护、易扩展、易复用等,而且在一些情况下(比如上面那个成绩单例子)你要是用继承就会增加很多了类,而且灵活性非常的差,那当然维护也不容易了,也就是说装饰模式可以替代继承,解决我们类膨胀的问题,你要知道继承是静态的给类增加功能,而装饰模式则是动态的给增加功能,你看上面的那个例子,我不想要SortDecorator这层的封装也很简单呀,直接在Father中去掉就可以了,如果你用继承就必须修改程序。

 

 

使用的代码:

/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 装饰类,我要把我的成绩单装饰一下
*/
public abstract class Decorator extends SchoolReport{
//首先我要知道是那个成绩单
private SchoolReport sr;
//构造函数,传递成绩单过来
public Decorator(SchoolReport sr){

this.sr = sr;
}
//成绩单还是要被看到的
public void report(){
this.sr.report();
}
//看完毕还是要签名的
public void sign(String name){
this.sr.sign(name);
}
}

 

 

/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 学校排名的情况汇报
*/
public class SortDecorator extends Decorator {
//构造函数
public SortDecorator(SchoolReport sr){
super(sr);
}
//告诉老爸学校的排名情况
private void reportSort(){
System.out.println("我是排名第38名...");
}
//老爸看完成绩单后再告诉他,加强作用
@Override
public void report(){
super.report();
this.reportSort();
}
}

 

 

public static void main(String[] args) {
//成绩单拿过来
SchoolReport sr;//核心接口
sr = new FouthGradeSchoolReport(); //原装的成绩单
//加了最高分说明的成绩单
sr = new HighScoreDecorator(sr);//代理抽象类的某个具体实现类,该实现类对report方法做了重写
//又加了成绩排名的说明
sr = new SortDecorator(sr);////代理抽象类的某个具体实现类,该实现类对report方法做了重写(与上面一行代码二选一)
//看成绩单
sr.report();
//然后老爸,一看,很开心,就签名了
sr.sign("老三"); //我叫小三,老爸当然叫老三
}

具体代码见:设计模式之禅 中装饰模式

 

 

 

2:策略模式

3:代理模式:

clip_image004

 

 

简单代理模式与策略模式在功能上的很大的区别是:

    简单代理模式中,代理类知道被代理类的行为,因为代理类与被代理类实现的是同一个接口,因此代理类与被代理类的结构是相同的;

    而策略模式中,策略容器并不知道内部策略的详细信息,因为容器并没有实现与内部策略相同的接口,即容器与内部策略只是简单的组合关系,容器只是将内部策略的行为抽取出来,进行了统一的实现,策略模式使用了多态,代理模式没有使用多态。   策略模式,是指一个事物有几种解决办法,而通过环境使得这几种解决办法可以通过互换来改变环境的行为。比如现在环境类有一个排序的方法,而排序的方法有很 多种:冒泡,快速排序,插入排序,堆排序等。可以做一个排序的抽象类,具体的排序都各自继承抽象类。环境类可以通过替换的方式动态选择一个排序类来进行排 序操作。

 

    装饰模式,作者举了一个很有意思的例子,孙悟空的七十二变。它每变一种,就有那种动物具有的特性,但本质还是孙猴子。装饰模式就是在不改变现有类的接口下对现有类功能做扩充。很典型的JAVA中的IO包下的READER类的子类就是利用了装饰模式。

posted @ 2014-03-11 10:52  漠野飞鹰  阅读(474)  评论(0编辑  收藏  举报