装饰模式的定义
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
模型:
-
Component:抽象组件,是一个接口或者抽象类;就是定义的最原始的对象
-
ConcreteComponent:具体组件,实现类(需要装饰)
-
Decorator:装饰角色,一般是抽象类,实现接口;它的属性必然有个private变量指向Conponent抽象组件
-
ConcreteDecorator:具体的装饰对象
实例说明
举个例子:比如一个正在上高中的学生“小明”在考完试后,和父母说想买一款5000元的手机。
1.Component,抽象方法-买手机
public abstract class AbstractBuyPhone {
//主要是向父母提出想买手机的意向
public abstract void BuyPhone();
//父母是否同意
public abstract void Agree();
}
2.ConcreteComponent:具体的意向
public class XiaoMingBuyPhone extends AbstractBuyPhone {
@Override
public void BuyPhone() {
Log.d("qzs","我想买一款华为的5000元的手机");
}
@Override
public void Agree() {
Log.d("qzs","父母同意了");
}
}
3.Decorator,增加一个装饰抽象类,方便修饰
public class AbstractDecorator extends AbstractBuyPhone {
private AbstractBuyPhone abstractBuyPhone;
public AbstractDecorator ( AbstractBuyPhone abstractBuyPhone){
this.abstractBuyPhone=abstractBuyPhone;
}
@Override
public void BuyPhone() {
this.abstractBuyPhone.BuyPhone();
}
@Override
public void Agree() {
this.abstractBuyPhone.Agree();
}
}
4.ConcreteDecorator:如果直接去找父母要手机,很容易被拒绝,所以需要修饰一下,这里用成绩修饰一下
public class ScoreDecortator extends AbstractDecorator {
public ScoreDecortator(AbstractBuyPhone abstractBuyPhone) {
super(abstractBuyPhone);
}
//先和父母说说自己的成绩
private void ShowScore(){
Log.d("qzs","我这次考试的成绩年级前三,又进步了");
}
//重写买手机的方法,先汇报成绩,然后再提买手机的事情
@Override
public void BuyPhone() {
this.ShowScore();
super.BuyPhone();
}
}
5.调用,也就是请求父母:
AbstractBuyPhone str;
//小明的原本意向
str=new XiaoMingBuyPhone();
//修饰后的意向
str=new ScoreDecortator(str);
//向父母提出想法(成绩和买手机)
str.BuyPhone();
//父母同意了
str.Agree();
运行结果:
强调:这里只加了分数的修饰,可以加多个修饰类来满足你最后的目的
装饰模式的优缺点及其他
1.优点
-
Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
-
通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
2.缺点
-
这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
-
装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
-
装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。
3.适用场景
-
需要扩展一个类的功能,或给一个类添加附加职责。
-
需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
定义和优缺点来自网上百度信息
相关推荐
设计模式详解,设计模式有助于代码水平的提高,实现方式为JAVA语言,通俗易懂,mobi格式,适合kindle
23种设计模式(通俗易懂篇),抛开繁琐的代码,抛开烦人的官方描述,过来看看这玩意,包你有所收获
java24种设计模式详细讲解,内容讲解通俗易懂,附有实例讲解
本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...
极好的资料,读过后 PHP上了一个台阶,对设计模式和面向对象思想进行了详细的讲解,简单易懂
里面包含里一个《JAVA设计模式.chm》 文件。 介绍了Java里面的常用的24个模式,文件层次结构清晰, 通俗易懂,很适合学习设计模式。希望对你用用!!!
多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍JAVA线程相关的设计模式概念,并且通过实际的JAVA程序范例和UML图示来一一解说,书中有代码的重要部分加上标注使读者更加容易...
多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍JAVA线程相关的设计模式概念,并且通过实际的JAVA程序范例和UML图示来一一解说,书中有代码的重要部分加上标注使读者更加容易...
非常详细的c#设计模式分析及其例程,通俗易懂,非常适合正在学习设计模式研究学习之用
本文以通俗易懂的语言,详细介绍了23种设计模式。通过比喻和简单的例子,解释了每种设计模式的工作原理和用途,旨在帮助初学者理解并应用这些模式,以提高代码的质量和可维护性。 **适用人群**: 这篇文章适合编程...
此文件包括两部pdf文件,一部适合初学者,内容通俗易懂。一部适合需要设计模式提高者。
java 多线程设计模式, 一个很不错的学习java多线程的书,并配有源代码。是学习java多线程的很好的参考书,易懂且有深度。
23种设计模式代码示例讲解, 简单,易懂
JAVA的23种设计模式,要详细的解释以及简单易懂的例子和备注
java23种设计模式,每种设计模式代码示例详解,源码详细,通俗易懂。
Java的设计模式详解,通俗易懂,轻松掌握设计模式,在Java技术上进阶
:hot_beverage: 用Java实现的设计模式〜 配套博客学习笔记: ://yubuntu0109.github.io/tags/design-and-pattern/ 参考书籍(推荐): 《Java设计模式 - 刘伟》 , 《图解设计模式 - [日]结城浩》 创建型模式 :...
很适合初学软件设计模型,总结的很全,简单通俗易懂 5个创建模式: 1、Abstract Factory 抽象工厂 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 2、Builder 生成器 将一个复杂对象的...