装饰设计模式

装饰设计模式就是对已有的对象的功能进行增强简单小例子:我们考虑一下使用继承也可以对父类中的功能进行增强只需要调用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 软件架构与设计模式_软件架构设计

    软件架构与设计模式_软件架构设计什么是架构?软件体系结构通常被称为架构,指可以预制和可重构的软件框架结构。架构尚处在发展期,对于其定义,学术界尚未形成一个统一的意见,而不同角度的视点也会造成软件体系结构的不同理解,以下是一些主流的标准观点。ANSI/IEEE610.12-1990软件工程标准词汇对于体系结构定义是:“体系架构是以构件、构件之间的关系、构件与环境之间的关系为内容的某一系统的基本组…

    2022年8月31日
    4
  • Node.js中常见的异步/等待设计模式

    Node.js中常见的异步/等待设计模式

    2021年6月7日
    84
  • 23种设计模式汇总整理

    设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式,共七种:适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。其实还有两类:并发型模式和线程池模式。…

    2022年3月11日
    38
  • Java设计模式之行为型:模板方法模式

    Java设计模式之行为型:模板方法模式

    2021年10月4日
    48
  • 深入理解设计模式之建造者模式

    深入理解设计模式之建造者模式老大突然拉住我,喜滋滋地告诉我:“公司很满意我们做的模型,又签订了一个合同,把奔驰、宝马的车辆模型都交给我们公司制作了,不过这次额外增加了一个新需求:汽车的启动、停止、喇叭声音、引擎声音都由客户自己控制,想什么顺序就什么顺序”那我们开始设计,来看一下类图:类图比较简单,在CarModel中我们定义了一个setSequence方法,车辆模型的这几个动作要如何排布,是在这个ArrayList中定义的。然后run()方法根据sequence定义的顺序完成指定的顺序动作。我们来看模型抽象类代码:

    2025年6月25日
    6
  • 常用设计模式总结

    常用设计模式总结设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,是可复用面向对象软件的基础。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中…

    2022年7月16日
    16

发表回复

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

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