设计模式之简单理解装饰器模式与运用

1.什么是装饰器模式

? 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

? 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

2、装饰器模式的重要组成部分

①装饰器模式特点:

(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。

(2) 装饰对象包含一个真实对象的引用(reference)

(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。

(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

②装饰器模式由组件和装饰者组成:
  • 抽象组件(Component):需要装饰的抽象对象。
  • 具体组件(ConcreteComponent):是我们需要装饰的对象。
  • 抽象装饰类(Decorator):内含指向抽象组件的引用及装饰者共有的方法。
  • 具体装饰类(ConcreteDecorator):被装饰的对象。

3.装饰器模式的具体实现

生活中的装饰器小例子:

? 公路上的汽车川流不息,我们的生活总是繁忙不停。终于有了一个假期.我们开着汽车出去玩,但是正如世界上没有同样自己的一样,总想找点不一样的感觉。于是我们买了油漆,照着图案给车来个帅气的赛车纹理,终于与众不同了,我们开车去玩吧!

package jiagouxiancheng.month_11.day1103.zhuangshiqi;

interface Car {
    void run();
}

class BMWCar implements Car {
    @Override
    public void run() {
        System.out.println("宝马开动...");
    }
}

class BenzCar implements Car {
    @Override
    public void run() {
        System.out.println("奔驰开动...");
    }
}

/**
 * 赛车油漆涂料
 */
class PaintDecorator implements Car {

    protected Car car;

    public PaintDecorator(Car car) {
        this.car = car;
    }

    @Override
    public void run() {
        car.run();
    }

}

class CoolPanintDecorator extends PaintDecorator {

    public CoolPanintDecorator(Car car) {
        super(car);
    }

    @Override
    public void run() {
        cooolPanint();
        car.run();
    }

    private void cooolPanint() {
        System.out.print("刷上帅气的赛车图案的油漆->");
    }

}

/**
 * 给车来个酷酷的造型
 */
public class DriveCar {

    public static void main(String[] args) {

        System.out.println("公路上的车川流不息...");
        Car bmwCar = new BMWCar();
        Car benzCar = new BenzCar();
        bmwCar.run();
        benzCar.run();
        System.out.println("这次我们先给车来个酷酷的造型!");
        Car car = new CoolPanintDecorator(benzCar);
        car.run();

    }
}
输出结果:
公路上的车川流不息...
宝马开动...
奔驰开动...
这次我们先给车来个酷酷的造型!
刷上帅气的赛车图案的油漆->奔驰开动...
4.总结

①优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

②缺点:多层装饰比较复杂。

③使用场景:1、扩展一个类的功能。 2、动态增加功能,动态撤销。

原文地址:https://www.cnblogs.com/charlypage/p/11787589.html

时间: 2024-07-31 06:47:27

设计模式之简单理解装饰器模式与运用的相关文章

设计模式(八)装饰器模式Decorator(结构型)

设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许

Java设计模式(四) 装饰器模式 代理器模式

(七)装饰器模式 Decorator 装饰器模式是为了动态的给一个对象增加一些新功能.装饰对象与被装饰的对象需要实现同一个接口,装饰对象持有被装饰对象的实例. interface DecoratorSourceable{ public void method(); } //被装饰类 class DecoratorSource implements DecoratorSourceable{ public void method(){ System.out.println("Source"

Python之简单理解装饰器(1)

装饰器是Python高级应用的一部分,其应用也很广泛.网上对其介绍和讲解也是五花八门,我在这里就对其进行简单介绍,并对如何渐进理解使用装饰器进行说明,以便和大家共同学习.如有更高见解,也请大家留言指正. 装饰器概念简单理解 循序渐进装饰器 装饰器概念简单理解 装饰器按照我的理解,就是在不改变原有函数代码的情况下,对原有函数进行功能的扩展. 这里先写个简单的装饰器,给大家有个概念性的认识. def anotherone(func):  #定义装饰器     def inner():        

设计模式(三)——装饰器模式(Decorator Pattern)

发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装潢吧,比如刚买的毛坯房,只有一个没有门,直接就可以进去. 首先设计一个房子类Room,实现一个进入方法Access /// <summary> /// 抽象接口 用来进行约束 /// </summary> public interface IAccess { void Access()

【设计模式】9、装饰器模式

1 package com.shejimoshi.structural.Decorator; 2 3 4 /** 5 * 功能:这个是我们装饰器的基类,用来生成被装饰类和装饰器类 6 * 时间:2016年2月25日上午10:05:37 7 * 作者:cutter_point 8 */ 9 public abstract class Component 10 { 11 //这个方法就是我们装饰器要进行装饰的操作 12 public abstract void tuo(); 13 } 1 packa

设计模式(四)装饰器模式

首先,让我们看看枪: 某一把枪,可以给它加上不同的组件,使它具有不同的功能.比如说ak47原来是这样: 给他加了刺刀之后,它有了拼刺刀的作用: 如果给它加上望远镜,于是有了瞄准狙击的功能: 如果还要添加功能,这里我们就可以用装配器模式对这个枪进行修饰.一个普通枪以及其他种类的枪都属于武器,也就是说他们都要继承一个武器类,无论是普通枪还是添加了功能的枪他们都是枪,此外,一个枪不仅可以安装望远镜,还可以同时安装刺刀.于是乎装配器模式的关系可以用下图来形容,建模工具搞了半天没搞到. Gun和Funct

用最简单的例子理解装饰器模式(Decorator Pattern)

假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格.最终呈现出来的效果是:把产品组合的所有元素呈现出来,并显示该组合的价格. 每个产品都有名称和价格,首先设计一个关于产品的抽象基类. public abstract class ProductBase { public abstract string GetName(); public abstract double GetPrice(); } 所有的产品都必须继承这个基类,比如家居用品.电器产品等,把这些具体的产品提

理解-装饰器模式-设计模式

package com.hk.ztry; interface Sourcable { public void operation(); } class Source implements Sourcable { public void operation() { System.out.println("Soure类实现了原始接口Sourcable中的方法"); } } class Decorator1 implements Sourcable { private Sourcable s

设计模式(七)——装饰器模式

如果可以通过已经存在的类,额外添加一个功能生成一个新的类,这种类就是一个装饰器 装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加对象功能来说, 装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式. Component(抽象构件):它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理   未被装饰的对象以及装饰之后的对象,实现客户端的透明操作.ConcreteComponent(具体构件):它