装饰设计模式

装饰设计模式就是对已有的对象的功能进行增强简单小例子:我们考虑一下使用继承也可以对父类中的功能进行增强只需要调用super就可以调用父类的方法,那使用装饰和继承有什么区别?使用继承体系就会有点臃肿

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

装饰设计模式就是对已有的对象的功能进行增强

简单小例子:

class Person  
{  
    void chifan()  
    {  
        System.out.println("chifan");  
    }  
}  
  
/* 
为了不随便改变原有的代码。 
还要增强chifan功能。 
那么就定义一个类,对原有对象进行装饰。
 by 何问起 
*/  
class NewPerson  
{  
    private Person p;  
    NewPerson(Person p)  
    {  
        this.p = p;  
    }  
    public void newChifan()  
    {     
        System.out.println("来一杯");  
        p.chifan();  
        System.out.println("来一根");  
    }  
}  
  
class  PersonDemo  
{  
    public static void main(String[] args)   
    {  
        Person p = new Person();  
          
        //NewPerson np = new NewPerson(p);  
        //np.newChifan();  
  
        p.chifan();  
    }  
}  

// hovertree.com

我们考虑一下使用继承也可以对父类中的功能进行增强只需要调用super就可以调用父类的方法,那使用装饰和继承有什么区别?
使用继承体系就会有点臃肿,因为当平房想要改成欧式时,还要建立子类。

Writer
|–FileWriter  
|–BufferedFileWriter。
|–DataWriter
|–BufferedDataWriter。
|–MediaWriter
|–BufferedMediaWriter.

优化:
可以将缓冲技术单独抽取进行封装。
要缓冲区谁将谁和缓冲相关联即可。
这样的设计的相对体系会变的简单。

使用继承带来的局限性:

/* 
房子:平房,楼房。 
 
House 
    |--PingFang 
    |--LouFang 
 
 
准备对房子进行装修。 
 
    1,对平房进行田园风光式的打造。 
    2,对楼房进行欧式风格的打造。 
可以用继承的方式来完成。 
House 
    |--PingFang 
        |--TianYuanPingFang 
    |--LouFang 
        |--OuShiLouFang 
 
     
该体系就有点臃肿,因为当平房想要改成欧式时,还要建立子类。 
何问起
hovertree.com
*/  
abstract class House  
{  
    abstract void show();  
}  
  
class PingFang extends House  
{  
    public void show()  
    {  
        System.out.println("平房");  
    }  
}  
  
class TianYuanPingFang extends PingFang  
{  
    public void showTianYuan()  
    {  
        super.show();  
        System.out.println("田园风格");  
    }     
}  
  
class LouFang extends House  
{  
    public void show()  
    {  
        System.out.println("楼房");  
    }  
}  
class OuShiLouFang extends LouFang  
{  
    public void showOuShi()  
    {  
        super.show();  
        System.out.println("欧式风格");  
    }  
}  
  
  
  
class  HouseDemo  
{  
    public static void main(String[] args)   
    {  
        PingFang p = new PingFang();  
        ///p.show();  
  
        TianYuanPingFang t = new TianYuanPingFang();  
        t.showTianYuan();  
  
  
        LouFang l = new LouFang();  
        //l.show();  
        OuShiLouFang o = new OuShiLouFang();  
        o.showOuShi();  
    }  
}  

使用装饰设计模式进行装饰:

/* 
 
原体系: 
House 
    |--PingFang 
    |--LouFang 
无论将平房打造成田园还是欧式,都是对平房一种装修。 
而该装修也可以用楼房。 
 by 何问起
hovertree.com
将现将该装修定义好,需要把什么房子进行改装修,传入即可。 
House 
    |--PingFang 
    |--LouFang 
    |--TianYuan 
    |--OuShi 
 
*/  
abstract class House  
{  
    abstract void show();  
}  
  
class PingFang extends House  
{  
    public void show()  
    {  
        System.out.println("平房");  
    }  
}  
  
  
class LouFang extends House  
{  
    public void show()  
    {  
        System.out.println("楼房");  
    }  
}  
  
  
class TianYuan extends House  
{  
  
    private House h;  
    TianYuan(House h)  
    {  
        this.h = h;  
    }  
    public void show()  
    {  
        System.out.println("田园风格");  
    }  
  
    public void showTianYuan()  
    {  
        h.show();  
        this.show();  
    }  
  
}  
  
  
class OuShi extends House  
{  
    private House h;  
    OuShi(House h)  
    {  
        this.h = h;  
    }  
    public void show()  
    {  
        System.out.println("欧式风格");  
    }  
  
    public void showOuShi()  
    {  
        h.show();  
        this.show();  
    }  
  
}  
  
class  HouseDemo2  
{  
    public static void main(String[] args)   
    {  
        PingFang p = new PingFang();  
        LouFang l = new LouFang();  
  
        OuShi o = new OuShi(new TianYuan(p));  
        o.showOuShi();  
  
        //TianYuan t = new TianYuan(l);  
        //t.showTianYuan();  
  
        //OuShi o = new OuShi(l);  
        //o.showOuShi();  
    }  
}  

 转自:http://hovertree.com/h/bjaf/zhuangshi.htm

推荐:http://www.cnblogs.com/roucheng/p/chengxuyuan.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120587.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月22日 下午10:00
下一篇 2021年12月22日 下午11:00


相关推荐

  • C++23种设计模式(20)-状态模式

    C++23种设计模式(20)-状态模式状态模式 允许一个对象在其内部状态改变时改变它的行为 对象看起来似乎修改了它的类 它有两种使用情况 1 一个对象的行为取决于它的状态 并且它必须在运行时刻根据状态改变它的行为 2 一个操作中含有庞大的多分支的条件语句 且这些分支依赖于该对象的状态 本文的例子为第一种情况 以战争为例 假设一场战争需经历四个阶段 前期 中期 后期 结束 当战争处于不同的阶段 战争的行为是不一样的 也就说战争的行为取决于所处的阶段 而且随着时间的推进是动态变化的 include iostream in iostream

    2025年6月23日
    6
  • Java常用的设计模式

    Java常用的设计模式

    2021年5月5日
    111
  • JAVA设计模式之原型模式

    定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。类型:创建类模式类图:原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在ja

    2022年3月11日
    43
  • Java设计模式之创建型:建造者模式

    Java设计模式之创建型:建造者模式

    2021年10月4日
    46
  • 北风设计模式课程—9、原型模式的作用和意义[通俗易懂]

    北风设计模式课程—9、原型模式的作用和意义[通俗易懂]北风设计模式课程—9、原型模式的作用和意义

    2022年4月22日
    57
  • JAVA设计模式——适配器模式

    JAVA设计模式——适配器模式适配器模式是一种结构型设计模式。适配器模式的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。用电器来打个比喻:有一个电器的插头是三脚的,而现有的插座是两孔的,要使插头插上插座,我们需要一个插头转换器,这个转换器即是适配器。适配器模式涉及3个角色:源(Adaptee):需要被适配的对象或类型,相当于插头。适配器(Ad

    2022年7月25日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号