设计模式:装饰模式

2018-03-01 11:24:35来源:oschina作者:Zing丶人点击

分享

1. 认识装饰模式


博主最近在学习装饰模式中,看了很多资料,发现一个贴近生活的例子,结构如下:



(1)Cake为统一接口,也是装饰类和被装饰类的基本类型。


(2)WifeCake为具体实现类,也就是被装饰类。


(3)Cake_AddSomeThings是装饰类,实现Cake的同时,拥有一个Cake实例。


(4)Cake_Egg和Cake_Ham都是具体的装饰类,具有自己的装饰特点。


2. 代码实现简单的装饰模式


(1)基础接口


/**
* Title: 饼
*/
public interface Cake {
/**
* 售价
* @return
*/
public double prices();
}

(2)被装饰类,基础接口的具体实现


/**
* Title: 老婆饼
*/
public class WifeCake implements Cake{
@Override
public double prices() {
return 4;
}
}

(3)装饰类


/**
* Title: 加料后的老婆饼
*/
public class Cake_AddSomeThings implements Cake{
/**
* 包含一个抽象对象
*/
private Cake cake;public Cake_AddSomeThings(Cake cake){
this.cake = cake;
}@Override
public double prices() {
return cake.prices();
}
}

(4)具体装饰类


/**
* Title: 饼加个蛋
*/
public class Cake_Egg extends Cake_AddSomeThings{
public Cake_Egg(Cake cake) {
super(cake);
}
/**
* 加个蛋加1块
*/
public double prices(){
return super.prices()+1;
}
}
/**
* Title: 饼加火腿
*/
public class Cake_Ham extends Cake_AddSomeThings{
public Cake_Ham(Cake cake) {
super(cake);
}
/**
* 加个火腿加2块
*/
public double prices(){
return super.prices()+2;
}
}

以上,就是一个简单的装饰模式的体系,下面是具体使用:


public class MyMain {
public static void main(String[] args) {
/**
* 获得一个无添加的老婆饼
*/
Cake wifecake = new WifeCake();
/**
* 加个蛋
*/
wifecake = new Cake_Egg(wifecake);
/**
* 加个火腿
*/
wifecake = new Cake_Ham(wifecake);
/**
* 最终要多少钱呢?
*/
System.out.println("老婆饼:"+wifecake.prices());
}
}

控制台输出结果如下:



总结:在此次演示中,对象wifecake从初始化后,对象一直没变,这符合装饰模式的特性。


3. 装饰模式的特点


(1)装饰对象和被装饰对象是实现同一个接口。


(2)装饰对象包含一个真实对象的引用。


(3)装饰对象增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。


4. 装饰模式的利弊


利:装饰模式在拓展对象的功能时比单纯的继承要灵活很多,也具有高拓展性。在使用不同的装饰类对对象进行装饰的时候,可以有不同的组合,可以组合成很多不同的结果。


弊:装饰模式的灵活性是建立在了很多装饰小类上,所以当小类变多的时候,会使系统变得复杂,也就是低简洁性。而且在拿到一个被装饰的对象时,你不知道它具体被装饰过多少次,让人不太容易理解。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台