设计模式之装饰模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值