装饰模式可以动态的为类的方法更换(增强)功能。
假如有一个方法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函数中的第一句,就可以动态的调整穿什么衣服和穿衣的顺序了。
这个例子的执行顺序是
穿体恤衫
穿裤子
戴墨镜
你们可以试着改变一下顺序哦
分享到:
相关推荐
装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...
装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。
"设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...
"深入浅出设计模式三——Beverage实现(装饰者模式)"这一标题指出,我们将探讨如何使用装饰者模式来实现一个饮品系统。装饰者模式是一种结构型设计模式,它允许我们在运行时向对象添加新的行为或职责,而无需修改对象...
装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为或属性,而不必修改原有类的代码。在C#中,装饰模式常用于扩展对象的功能,同时保持对象接口的一致性。本实例是关于如何在开发图形界面构件库...
在博客文章“装饰者模式——Decorator”中,作者可能详细讲解了以下几个方面: 1. 装饰者模式的基本概念和原理。 2. 如何通过代码示例展示装饰者模式的实现。 3. 装饰者模式与继承的区别和优势。 4. 装饰者模式在...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。刘伟先生在讲解设计模式时,通常会深入浅出地介绍这些模式的原理、应用场景以及如何有效地在实际编程中应用它们。设计模式并不是...
《设计模式——GFour》是一本深受IT从业者喜爱的经典书籍,尤其在C++开发者中具有广泛影响力。设计模式是软件工程领域中的一种最佳实践,它总结了在特定情境下解决问题的常见方法,使得代码可读性更强,复用性更高,...
装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...
装饰模式动态地给一个对象添加一些额外的职责;外观模式提供了一个统一的接口,用来访问子系统中的多个接口;代理模式为其他对象提供一种代理以控制对这个对象的访问;组合模式将对象组合成树形结构以表示“部分-...
- 装饰模式:动态地给一个对象添加一些额外的职责。 - 外观模式:提供一个统一的接口,用来访问子系统中的多个接口。 - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 3. **行为型模式**: - 责任...
本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
在"设计模式之装饰模式:以售卖咖啡为例"的场景中,我们可以详细解析其应用。 首先,咖啡的选择过程可以看作是基础产品(Component),例如原味咖啡。客户可以选择的基础咖啡类型可能包括拿铁、卡布奇诺等,这些都...