您的位置:首页 > 其它

设计模式之装饰模式

2015-12-06 13:51 573 查看
(各种设计模式的源代码在 https://github.com/mjnjust/Designmode.git ,使用utf8编码)

一、定义

动态的给一个对象添加一些额外的职责

二、实例

2.1 假如你是买电脑的销售人员,你在顾客交流的时候不可能只说说某某电脑显卡什么型号,内存多大,使用的材料是什么……

肯定还要说一些通俗易懂的,如果对方是学生爱玩游戏,你要告诉它这电脑玩游戏很好;如果人家是工作了的白领,你要告诉它

这电脑可以同时运行很多东西……

总之就是见人说人话见鬼说鬼话,那么怎么用代码实现这个过程呢?

分析一下,首先,电脑的本身的特性是不变的,也就是说内存啊、显卡啊什么都是要老老实实和顾客说的,但是其它的修饰就

因人而异了。

首先定义一个抽象的电脑类

public abstract class Computer {
public abstract void   introduce() ;
}


然后定义一个具体的电脑类


public class LenoveComputer extends Computer {
@Override
public void introduce() {
System.out.println("显卡型号:XX 内存大小:8G 显存大小:6G ......");
}

}


定义一个基础的装饰类,因为我们要装饰的是电脑,所以我们的装饰类很自然的就需要继承Computer


public class Decorate extends Computer {
private Computer computer ;

public Decorate(Computer computer) {
this.computer = computer ;
}

@Override
public void introduce() {
this.computer.introduce();
}
}


实现真正的装饰类


public class RealDecorate1 extends Decorate {
public RealDecorate1(Computer computer) {
super(computer);
}

public void decorate() {
System.out.println("这显卡,玩lol完全没问题!");
}

@Override
public void    introduce(){
super.introduce();
this.decorate();
}

}
public class RealDecorate2 extends Decorate {
public RealDecorate2(Computer computer) {
super(computer);
}

public void decorate() {
System.out.println("这内存,可以同时开很多很多东西而不卡啊!");
}

@Override
public void introduce(){
super.introduce();
this.decorate();
}
}


测试代码:

Computer computer = new LenoveComputer();
computer = new RealDecorate1(computer);
computer = new RealDecorate2(computer);
computer.introduce();


运行结果:

显卡型号:XX 内存大小:8G 显存大小:6G ......
这显卡,玩lol完全没问题!
这内存,可以同时开很多很多东西而不卡啊!


2.2 说明
这几个类看起来有点奇怪,尤其是看了测试代码以后,更加奇怪。我们要明白的是不管Decorate还是RealDecorate,他们都是Computer类继承而来,他们都是Computer类。 computer = new RealDecorate1(computer),这句话首先给computer
套上了第一层RealDecorate1的封装,  computer = new RealDecorate2(computer)又给computer套上了第二层封装,
最终computer指向的如下图所示(结合代码理解):




执行computer.introduce()函数的时候,首先执行RealDecorate2.introduce(),然后根据这个函数里面的调用关系往下运行。

2.3 装饰模式的好处:
在某种程度上可以代替创建子类,而且可以装饰很多很多层。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: