首页 > 其他分享 >设计模式之——装饰者模式

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

时间:2024-09-22 16:01:11浏览次数:1  
标签:sport 对象 普通人 模式 public Person 设计模式 装饰

前言:

装饰者模式是结构性设计模式之一,其在不必改变类文件及不适用继承的情况下,动态的扩展一个对象的功能。它通过创建一个包装对象(即装饰)来包裹真实的对象。

一.定义

动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

装饰者模式的结构图:

装饰者模式有如下角色:

  • Component:可以是接口或者是抽象类,被装饰的最原始的对象。
  • ConcreteComponent:组件具体实现类。Component的具体实现,被装饰的具体对象(即包含原有功能的对象)。
  • Decorator:抽象装饰者,新增装饰类,用来扩展原有Component类的功能,对于Component来说无须知道Decorator的存在,所以在他的属性中必然有一个private变量指向Component抽象组件。
  • ConcreteDecorator:装饰者的具体实现类。

二.具体实现

装饰者模式在生活中有很多例子,我们这里来给一个普通的人【原来只会走路】学运动技能【新学会了游泳 + 拳击】后变大师的例子来说明。

(1)抽象组件

我们先定义一个人的抽象类,里面有运动的抽象方法。

public abstract class Person {
	/**
	 * Person 人有可以运动的抽象方法
 	 */
	public abstract void sport();
}

(2)组件具体实现类

被装饰的具体对象,这里是具体的一个普通人,作为一个普通人他当然会运动,当然在未被装饰的情况下他只会走路。

public class CommonPerson extends Person {
	@Override
	public void sport() {
		System.out.println("普通人运动只会走路");
	}
}

(3)抽象装饰者:
抽象装饰者保证了一个对抽象组件的引用,方便调用被装饰对象中的方法。在这里运动大师需要持有人(Person)的引用,方便教授他其他运动,最终成为运动健将。

public abstract class Master extends Person {
	private Person mPerson;
	public Master(Person person) {
		mPerson = person;
	}
	@Override
	public void sport() {
		mPerson.sport();
	}
}

(4)装饰者具体实现类:
这里有两个装饰者具体实现类,分别是宁泽涛跟邹市明,他们(装饰者)负责向普通人(被装饰者)教授游泳跟拳击。

public class Ningzetao extends Master {
	public Ningzetao(Person person){
		super(person)
	}
	@Override
	public void sport() {
		super.sport();
		teachSwimming();
	}
	public void teachSwimming(){
		System.out.println("宁泽涛教普通人游泳");
	}
}

public class Zoushiming extends Master {
	public Zoushiming(Person person){
		super(person)
	}
	@Override
	public void sport() {
		super.sport();
		teachBoxing();
	}
	public void teachBoxing(){
		System.out.println("邹市明教普通人拳击");
	}
}

(5)客户端调用:
经过宁泽涛跟邹市明的教导后,普通人经过装饰后,除了会走路之外,也学会了游泳跟拳击。

public class Client {
	public static void main (String[] args) {
		//创建普通人,只会走路
		CommonPerson mCommonPerson = new CommonPerson();
		
		//宁泽涛教普通人学游泳,普通人学会了游泳
		Ningzetao mNingzetao = new Ningzetao(mCommonPerson);
		mNingzetao.sport();
		
		//邹市明教普通人学拳击,普通人学会了拳击
		Zoushiming mZoushiming = new Zoushiming(mCommonPerson);
		mZoushiming.sport();
	}
}

三.使用场景

  • 在不影响其他对象的情况下,以动态,透明的方式给单个对象添加职责。
  • 需要动态的给一个对象添加功能,这些功能可以动态的撤销。
  • 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护。

四.优缺点

优点:

  • 通过组合而非继承的方式,动态的扩展一个对象的功能,在运行时可以选择不同的装饰器从而实现不同的功能。
  • 有效的避免了使用继承的方式扩展对象功能而带来的灵活差,子类无限制扩张的问题。
  • 具体组件类与具体装饰类可以独立变化,用户可以根据需要新增具体组件类跟装饰类,在使用时在对其进行组合,原有代码无需改变,符合“开闭原则”。

缺点:

  • 因为所有对象均继承于Component,所以如果Component内部结构发生改变,则不可避免的影响到所有子类(装饰者于被装饰者)。如果基类改变,则势必影响对象的内部。
  • 装饰者比继承更容易出错,排错也比较困难。对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为繁琐。所以一般只在必要的时候使用装饰者模式。
  • 装饰层数不能过多,否则会影响效率。

注意:

乍一看装饰者模式跟代理模式很像,其实不然,两者最大的区别是:

装饰者模式应该为所装饰的对象增强功能。

而代理模式对代理的对象施加控制,并不提供对象本身的增强功能。

标签:sport,对象,普通人,模式,public,Person,设计模式,装饰
From: https://www.cnblogs.com/chenlei210162701002/p/18425421

相关文章

  • 软件设计模式-装饰者模式
    装饰模式应用场景:最基础用法:当需要对类A的对象添加一些自定义不同的方法时,直接在类A中添加方法不太好!那么需要一个类B继承类A,类B里面增加一个类A的对象作为自己的成员并自定义一个方法Bfunc,再重载类A中的某个方法func,在该方法里面调用自己的Bfunc。高级用法:假设要对男英雄和女......
  • c#代码介绍23种设计模式_03工厂模式
    目录1.工厂方法模式之所以可以解决简单工厂的模式2.使用工厂方法实现的系统,如果系统需要添加新产品时3.从UML图来看4、实现思路1.工厂方法模式之所以可以解决简单工厂的模式是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出......
  • C++ std::call_once 实现单例模式
    #if1#include<iostream>#include<memory>#include<mutex>usingnamespacestd;classSingleton{public:staticSingleton&getInstance(){std::call_once(m_OnceFlag,&Singleton::init);return*m_Insta......
  • 实现单例模式
    对于一些管理的类,且只需要创建一次对象的类我们可以把它设置为单例模式一、c#和unity中不继承MonoBehaviour如何实现单例模式:1.在类中创建改类的静态私有对象并且初始化堆区空间2.提供给外部一个静态的公共属性来获得改静态私有对象(只可以得不允许外部改,防止外部置空)3.写一......
  • 链动3+1滑落模式小程序开发
    链动3+1滑落模式是一种在电商、微商或社交电商领域常用的营销模式,通过用户推荐新用户形成团队结构,并依据团队的发展给予相应的奖励或优惠。在小程序平台上开发链动3+1滑落模式,需要考虑到用户体验、数据安全、奖励机制的实现等多个方面。以下是一些基本的开发步骤和考虑因素:1.......
  • LL学设计模式之最终章
    序学习过好多遍设计模式。感觉还是没学会。面试啥的又说不出来。这是最后一次了。忘了并不代表不会。知道个大概就行了为啥要学设计模式:1:阅读源代码的时候,知道是啥设计模式,就更容易看懂。2:为了写出好的容易扩展的代码。应对各种变化。简单。设计模式有指导原则。设计模式......
  • 增强 React 列表渲染:干净且可重用的模式
    作为react开发人员,我们都遇到过需要渲染数据列表的场景。虽然.map()方法效果很好,但每次渲染列表时重复相同的逻辑可能会让人筋疲力尽,并导致代码重复。幸运的是,有一种更干净、可扩展的方法来处理这个问题,使用可重用组件、高阶组件或自定义挂钩。在本文中,我将分享一种改进react......
  • 实景三维+耕地保护:构建耕地资源管理的全闭环新模式
    在耕地资源日益珍贵的今天,如何高效、精准地实施耕地保护,成为了我国农业可持续发展与生态文明建设的关键课题。“实景三维+耕地保护”的创新模式,能够为这一挑战提供突破性的解决方案,打造一个从前端监测到后端管理的全闭环耕地保护管理模式。本文将深入分析这一模式的核心价值、......
  • 【JavaWeb从入门到精通系列】 - JavaSE基础篇(1) - 抽象,静态,单例设计模式
    一、抽象1、存在意义似是而非的,像却又不是;具有某种特征,但不完整。Animal仅是一种会吃会睡的对象,再无其他行为,不够具体,不够完整。程序是用来模拟现实世界,解决实际问题的,现实世界中存在的都是动物具体的子类对象,并不存在动物对象,所以,Animal不应该被独立创建成对象。如何......
  • 化繁为简:中介者模式如何管理复杂对象交互
    化繁为简:中介者模式如何管理复杂对象交互中介者模式是一种行为型设计模式,定义了一个中介者对象,来封装一组对象之间的交互。中介者模式通过将对象之间的交互行为从多个对象中抽离出来,集中封装在一个中介者对象中,从而使各个对象之间的耦合松散,且可以独立地改变它们......