(各种设计模式的源代码在 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 装饰模式的好处:
在某种程度上可以代替创建子类,而且可以装饰很多很多层。