您的位置:首页 > 编程语言 > Java开发

java设计模式大话之装饰者模式

2017-01-19 17:47 232 查看
去年有一部很火的电视剧叫《伪装者》,胡歌、靳东、刘敏涛、王凯领衔主演,收视跟口碑都不错。没看过的小伙伴们可以去看下。



跑题了,聊聊正题装饰着模式:

在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,是不是有点伪装者的味道。

注意几点:

(1)装饰对象和真实对象有相同接口,这样客户端在用的时候就可以把装饰对象当成真实对象来用,这是实现的关键

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

(3)装饰对象接收所有来自客户端的请求,并把这些请求转发给真实的对象。

(4)装饰者可以在转发这些请求之前或者之后添加一些附加功能,这样就可以在不修改给定对象的结构情况下,附加功能,一般在设计的时候我们都是通过继承来扩展功能,而这种模式不需要子类就能扩展,更加灵活,方便。

类图:



具体实例:

小张的女朋友要过生日了,为了给她一个惊喜,小张特地偷学了做蛋糕的手艺,想自己做一个既美味又漂亮的蛋糕给女朋友,这不他买来了蛋糕面包,奶油,水果,还有一些别的小装饰品准备大干一场了。

public interface ICake
{
//准备材料
public void prepair();
//塑形制做
public void make();
}

//普通的奶油蛋糕
public class NormalCake implements ICake
{
//准备材料
public void prepair(){
System.out.println("正在准备原材料。。。");
};
//塑形制做
public void make(){
//prepair();
System.out.println("普通奶油蛋糕就快要出来了。。");
}
}

//小张是个追求浪漫的人,他看着自己做的简单的奶油蛋糕,一看不对,太普通了,一点惊喜都没有,还不如去外面直接买个蛋糕得了
,所以他决定重新做一个巧克力水果蛋糕,并写上女友的名字
创建抽象装饰者:
public abstract class AbstractCake implements ICake
{

private final ICake cake;
public AbstractCake(ICake cake){
this.cake=cake;
}
//准备材料
public void prepair(){
this.cake.prepair();
};
//塑形制做
public void make()
{

}
}

创建具体装饰者
public class Decorator extends AbstractCake{
public Decorator (ICake cake)
{
super(cake);
}

public void chocolate()
{
System.out.println("我开始给蛋糕涂上巧克力");
}

public void fruit()
{
System.out.println("我开始给蛋糕放上水果");
}

public void writeName()
{
System.out.println("我开始给蛋糕写名字");
}

public void make()
{
super.prepair();
this.chocolate();
this.fruit();
this.writeName();
super.make();
}
}

最终呈现
public class  Client
{
public static void main(String args[]){
System.out.println("开始做蛋糕");
//先做一个普通的奶油蛋糕
ICake normalcake=new NormalCake();
//下面就开始进行装饰
normalcake=new Decorator(normalcake);
normalcake.make();
System.out.println("蛋糕好了");
//装饰结束
}
}
运行结果:



总结:

(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

(2)处理那些可以撤消的职责。

(3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: