装饰模式

来源:互联网 发布:mac pptp vpn 设置 编辑:程序博客网 时间:2024/06/05 22:48

一总结装饰模式的用法
1. 需要动态的给一个对象添加功能(给自己或者别的对象赋予新的职责),这些功能可以再动态的撤销。
2. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。(采用继承的方式就可能出现类爆炸)

二场景:
披着羊皮的狼吃羊,原来是赤裸裸的吃,现在装饰一下,然后这只狡猾的狼开始披着羊皮吃羊,披着人皮吃羊,披着兔皮吃羊:

分析(根据下图设计):
1狼:被装饰者
2羊皮,人皮,兔皮是用来装饰的(装饰者),若这时候需要给狼再增加一种皮,那么只需要增加 继承DecoratedWithSkins 的类就可以了。
3 无论怎么伪装都还是只狼,所以大灰狼,和无论如何华丽的装饰都继承狼这个类

这里写图片描述

//Wolf.java(狼)package wby.firstzsms;public abstract class Wolf {    public abstract String eat();}//Timberwolf.java(大灰狼)package wby.firstzsms;//大灰狼public class Timberwolf extends Wolf{    @Override    public String eat() {        return "吃羊";    }}//DecoratedWithSkins.java(皮肤)/*   皮肤也继承狼这个类,并且各种皮肤(装饰者)都has-a狼,使用组合的原因是:可以把狼和皮更好地匹配起来,若是只采用继承,就无法体现动态时多态的特点。*/package wby.firstzsms;public abstract class DecoratedWithSkins extends Wolf{    Wolf wolf;}//WolfInHumanSkin.java(人皮)package wby.firstzsms;public class WolfInHumanSkin  extends DecoratedWithSkins{    private final String WolfInHumanSkin_eatString="狼披着人皮";    public WolfInHumanSkin(Wolf wolf){        this.wolf=wolf;//被装饰着记录到实例中    }    public String eat() {        return WolfInHumanSkin_eatString+wolf.eat();    }}//WolfInSheepClothing.java(羊皮)package wby.firstzsms;public class WolfInSheepClothing extends DecoratedWithSkins{    private final String WolfInSheepClothing_eatSting="狼披着羊皮";    public WolfInSheepClothing(Wolf wolf){        this.wolf=wolf;    }    public String eat() {        return WolfInSheepClothing_eatSting+wolf.eat();    } }//ArabbitWolf.java(兔皮)package wby.firstzsms;public class ArabbitWolf extends DecoratedWithSkins{    private final String ArabbitWolf_eatString="狼披着兔皮";    public ArabbitWolf(Wolf wolf){        this.wolf=wolf;    }    public String eat() {        return ArabbitWolf_eatString+wolf.eat();    }}//3)、编写测试代码//Test.javapackage wby.firstzsms;public class Test {    public static void main(String[] args) {        Wolf wolf1=new Timberwolf();        wolf1=new ArabbitWolf(wolf1);//兔皮装饰狼(运行时动态增加职责)        System.out.println(wolf1.eat());        Wolf wolf2=new Timberwolf();        wolf2=new WolfInHumanSkin(wolf2);//人皮装饰狼(运行时动态增加职责)        System.out.println(wolf2.eat());    }}

运行结果:

狼披着兔皮吃羊狼披着人皮吃羊
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 晒黑怎么白回来 军训晒黑会自动恢复吗 晒黑变白 晒黑多久能白回来 晒黑图片 军训晒黑怎么白回来 被晒黑怎么变白 晒黑的图片 窦靖童晒黑眼妆 晒黑怎样变白 一般被晒黑后多久能够白回来 晒黑后多久能白回来 军训晒黑 男生晒黑怎么变白 军训晒黑怎么变白 太阳晒黑后怎样能快速变白 如何美白晒黑的皮肤 手被晒黑了怎么白回来 腿被晒黑怎么变白 腿晒黑了怎么快速变白小窍门 太阳晒黑了怎么变白 皮肤晒黑怎样变白 脸晒黑了怎么办 被晒黑了怎么办 晒黑了 脸被晒黑了怎么办 军训晒黑了怎么变白 天生黑怎么全身白 晒黑后怎么变白 脸部晒黑怎么快速变白 晒黑后怎么快速美白方法 被晒黑的皮肤怎样才能白回来 男生晒黑了怎么快速变白 晒黑后如何快速变白 男人晒黑了怎么快速变白 夏天晒黑了怎么变白 晒黑了怎么修复 晒黑修复 怎样让晒黑的脚变白 宝宝晒黑了怎么变白 晒黑后如何修复