`
garrincha
  • 浏览: 12821 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

设计模式之——装饰者模式

阅读更多
装饰模式可以动态的为类的方法更换(增强)功能。
假如有一个方法dress(),怎样可以改变其中的逻辑增加功能呢。
常见答案如下
继承,使用子类集成父类,然后override 方法dress()编写自己的逻辑

子类中的方法
@Override
public void dress(){
super.dress();
//自己的逻辑;
}


我们来说说继承的不足之处。首先继承是固定的,也就是说我有几个逻辑就需要继承出几个子类
这里我们借用《大话设计模式》里面的例子——穿衣服
穿衣服是一个搭配。
比如T恤衫牛仔裤,需要做一个类
public T_Pant extends SuperClass{
@Override 
public void dress(){
System.out.println("T恤衫");
System.out.println("牛仔裤");
}
}


又一种搭配呢?T恤衫 牛仔裤 大墨镜
public T_Pant_Glass extends SuperClass{
@Override 
public void dress(){
System.out.println("T恤衫");
System.out.println("牛仔裤");
System.out.println("大墨镜")
}
}


这样似乎不太好,因为有可以复用的代码。有人说,那我把T_Pant_Glass继承自T_Pant 这样可以复用一部分代码
public T_Pant_Glass extends T_Pant{
@Override 
public void dress(){
super.dress();
System.out.println("大墨镜");
}
}

这样好多了,但是要知道人的服装搭配是复杂多变的,如果要穷举出所有的搭配,并对每个搭配制作一个类,这是多么困难的事情。更进一步说,由于服装的搭配在变化,经常需要重构代码,比如上面的例子把“体恤衫牛仔裤大墨镜”类重构了。这样的工作是不是很让人崩溃。

那么怎么办,我们的需求是可以动态的组合这些服饰,想怎么搭配就怎么搭配,而不需要为每个搭配制作新的类。
那么我们对每个服饰做一个类,因为无论如何调整,每一种衣服是穿着搭配的最小单位。

装饰模式开始
1、做一个穿衣服的人的类
public class Person{
protected Person person;
public void dress(){
//什么也不做,因为没有衣服穿
}
}


2、做一个T恤衫类,是Person的子类,这个有点费解,因为不合乎常理,衣服并非是人的子类对吧,这个例子不太恰当,先凑合看,看明白意思就行
public class TShirt extends Person{
public void dress(){
public TShirt(Person p){
this.person = p;
}
System.out.println("穿体恤衫");
super.dress();
}
}

同理做裤子类,墨镜类
public class Pant extends Person{
public void dress(){
public Pant(Person p){
this.person = p;
}
System.out.println("穿裤子");
super.dress();
}
}


public class Glass extends Person{
public void dress(){
public Glass(Person p){
this.person = p;
}
System.out.println("戴墨镜");
super.dress();
}
}


然后呢,我们在客户端把他们串起来,也就是穿起来

main()
{
Person p= new TShirt(new Pant(new Glass(new Person())));
p.dress();
}


这样我们只要更改main函数中的第一句,就可以动态的调整穿什么衣服和穿衣的顺序了。

这个例子的执行顺序是

穿体恤衫
穿裤子
戴墨镜

你们可以试着改变一下顺序哦
0
0
分享到:
评论

相关推荐

    C#设计模式——装饰模式应用实例

    C#设计模式——装饰模式应用实例,开发一套图形界面构件库的框架实例。

    JAVA设计模式学习12——装饰器模式

    NULL 博文链接:https://alaric.iteye.com/blog/1911949

    设计模式——装饰模式

    NULL 博文链接:https://maidoudao.iteye.com/blog/1336072

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

    深入浅出设计模式三——Beverage实现(装饰者模式)

    NULL 博文链接:https://quicker.iteye.com/blog/607122

    Java设计模式 版本2

    对象的克隆——原型模式,复杂对象的组装与创建——建造者模式,不兼容结构的协调——适配器模式,处理多维度变化——桥接模式,树形结构的处理——组合模式,扩展系统功能——装饰模式,深入浅出外观模式,实现对象...

    Java设计模式-装饰者模式

    本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧...——《Head First 设计模式》

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    装饰者模式——Decorator

    NULL 博文链接:https://chuanwang66.iteye.com/blog/1325151

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    设计模式精解 译者:熊节 程序员必看书籍之一 part2

    设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。

    Pattern-Decorator-Java:设计模式工作坊——装饰者模式

    您必须实现装饰器模式,以便可以在运行时添加提到的服务。 作为开发服务如何工作的示例,在运行时创建一个用加密和缓存装饰的 JSON 策略,以及一个带有日志记录的 XML 策略。 请记住,您必须提供源代码和详细说明所...

    装饰设计模式——RecyclerView添加头部和底部-附件资源

    装饰设计模式——RecyclerView添加头部和底部-附件资源

    design-pattern-java.pdf

    扩展系统功能——装饰模式(三) 扩展系统功能——装饰模式(四) 外观模式-Facade Pattern 深入浅出外观模式(一) 深入浅出外观模式(二) 深入浅出外观模式(三) 享元模式-Flyweight Pattern 实现对象的复用——...

    深入浅出设计模式(中文版)

    4.4DecoratorPattern(装饰模式) 125 4.4.1定义 125 4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 ...

    深入浅出设计模式(中文版电子版)

    4.4DecoratorPattern(装饰模式) 125 4.4.1定义 125 4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 ...

    24种设计模式介绍与6大设计原则

    总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    设计模式精解-掌握设计模式

    本书从一个新的视角描述面向对象设计,将...\r\n 如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。\r\n 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。

    .NET中的设计模式——一步步发现装饰模式

    学习设计模式的基本目标是要用它,尤其是帮助那些有扎实的OOP基础,而对设计模式很困惑的人在设计中应用它。我不会为不同设计模式写很全面的参考,但我希望这些文章能让你入门。设计模式与特定的语言无关。虽然我用...

Global site tag (gtag.js) - Google Analytics