装饰模式可以动态的为类的方法更换(增强)功能。
假如有一个方法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函数中的第一句,就可以动态的调整穿什么衣服和穿衣的顺序了。
这个例子的执行顺序是
穿体恤衫
穿裤子
戴墨镜
你们可以试着改变一下顺序哦
分享到:
相关推荐
C#设计模式——装饰模式应用实例,开发一套图形界面构件库的框架实例。
NULL 博文链接:https://alaric.iteye.com/blog/1911949
NULL 博文链接:https://maidoudao.iteye.com/blog/1336072
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...
NULL 博文链接:https://quicker.iteye.com/blog/607122
对象的克隆——原型模式,复杂对象的组装与创建——建造者模式,不兼容结构的协调——适配器模式,处理多维度变化——桥接模式,树形结构的处理——组合模式,扩展系统功能——装饰模式,深入浅出外观模式,实现对象...
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧...——《Head First 设计模式》
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
NULL 博文链接:https://chuanwang66.iteye.com/blog/1325151
目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式
设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。
您必须实现装饰器模式,以便可以在运行时添加提到的服务。 作为开发服务如何工作的示例,在运行时创建一个用加密和缓存装饰的 JSON 策略,以及一个带有日志记录的 XML 策略。 请记住,您必须提供源代码和详细说明所...
装饰设计模式——RecyclerView添加头部和底部-附件资源
扩展系统功能——装饰模式(三) 扩展系统功能——装饰模式(四) 外观模式-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 ...
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
本书从一个新的视角描述面向对象设计,将...\r\n 如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。\r\n 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。
学习设计模式的基本目标是要用它,尤其是帮助那些有扎实的OOP基础,而对设计模式很困惑的人在设计中应用它。我不会为不同设计模式写很全面的参考,但我希望这些文章能让你入门。设计模式与特定的语言无关。虽然我用...