炒冷饭系列:设计模式 装饰模式

一、什么是抽象工厂模式

装饰( Decorator )模式又叫做包装模式。通 过一种对客户端透明的方式来扩展对象的功能, 是继承关系的一个替换方案。

二、装饰模式的结构 角色和职责

以下是对此图的见解,不服别喷。Component是实体接口 或者 抽象类。左边的ConcreteComponent是其实现(功能)。Decorator装饰,所谓的装饰抽象类就是把接口类实现,然后加上DoSomething的模块。

然后下面就是各个对具体装饰的实现,如果需要多功能结合 不是相互结合,而是通过父类抽象结合对象达到目的。具体可以参考下面案例的实现图解。

                            

抽象组件角色: 一个抽象接口,是被装饰类和 装饰类的父接口。

具体组件角色:为抽象组件的实现类。

抽象装饰角色:包含一个组件的引用,并定义了 与抽象组件一致的接口。

具体装饰角色:为抽象装饰角色的实现类。负责 具体的装饰。

三、装饰模式实现

局部类图:

具体实现:

Car

public interface Car {

    public void show();

    public void run();
}

RunCar

public class RunCar implements Car {

    public void run() {
        System.out.println("可以跑");
    }

    public void show() {
        this.run();
    }

}

CarDecorator

public abstract class CarDecorator implements Car{
    private Car car;

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

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

    public abstract void show();
}

上面相当于搭了好架子,后面需要具体实现了。

FlyCarDecorator

public class FlyCarDecorator extends CarDecorator{

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

    public void show() {
        this.getCar().show();
        this.fly();
    }

    public void fly() {
        System.out.println("可以飞");
    }

    public void run() {

    }
}

SwimCarDecorator

public class SwimCarDecorator extends CarDecorator {

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

    public void show() {
        this.getCar().show();
        this.swim();
    }

    public void swim() {
        System.out.println("可以游");
    }

    public void run() {

    }

}

然后测试代码

MainClass

public class MainClass {
    public static void main(String[] args) {
        Car car = new RunCar();

        car.show();
        System.out.println("---------");

        Car swimcar = new SwimCarDecorator(car);
        swimcar.show();
        System.out.println("---------");

        Car flySwimCar = new FlyCarDecorator(swimcar);
        flySwimCar.show();
    }
}

运行可以得到以下结果:

可以跑
---------
可以跑
可以游
---------
可以跑
可以游
可以飞
时间: 2024-08-28 12:05:34

炒冷饭系列:设计模式 装饰模式的相关文章

C++ 设计模式 装饰模式(Decorator Pattern)

C++ 设计模式 装饰模式 在结构型模式中装饰模式给我留下了深刻的印象,其中也感觉到在设计模式中基本都是 依赖C++的多态来实现,装饰模式也不例外,他允许在不改变原有类的代码的基础上, 不通过直接继承原有类的代码通过一个抽象接口层进行实现,甚至可以随意的组合, 所以这里记录之以备使用 下面是模型图: 下面是一个简单的模拟代码,模拟本来一个工具只有写功能,但是我们要不断的扩充其 功能让它有听有读的功能: 这是跑出来的结果 ----source tool---- i can write!! ----

C# 设计模式系列教程-装饰模式_C#教程

1. 概述 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活. 原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数.装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法.修饰类必须和原来的类有相同的接口. 2. 模式中的角色 2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态地添加职责. 2.2 具体构建(ConcreteComponent):定义一个具体的对象,也可以

炒冷饭系列:设计模式 工厂方法模式

一.什么是工厂方法模式 工厂方法模式同样属于类的创建型模式又被称 为多态工厂模式 .工厂方法模式的意义是定义一个创建 产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核心类成为一个 抽象工厂角色,仅负责具体工厂子类必须实现的接口, 这样进一步抽象化的好处是使得工厂方法模式可以使系 统在不修改具体工厂角色的情况下引进新的产品. 二.模式中包含的角色及其职责 1.抽象工厂(Creator)角色 工厂方法模式的核心,任何工厂类都必须实现这个接口. 2.具体工厂(

炒冷饭系列:设计模式 抽象工厂模式

一.什么是抽象工厂模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端 提供一个接口,使得客户端在不必指定产品的具 体类型的情况下,能够创建多个产品族的产品对象. 产品族和产品等级结构. 二.模式中包含的角色及其职责 1.抽象工厂(Creator)角色 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口. 2.具体工厂( Concrete Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象. 3.抽象

炒冷饭系列:设计模式 工厂模式

一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建 其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类可以被外界直接调用,创建所需的产品对象. 2.抽象(Product)角色 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口. 3.具体产品(Concrete Product)角色 简单工厂模式所创

炒冷饭系列:设计模式 单例模式

一.什么是单例模式 单例模式是一种对象创建型模式,使用单例模式, 可以保证为一个类只生成唯一的实例对象.也就是说, 在整个程序空间中,该类只存在一个实例对象. 其实,GoF对单例模式的定义是:保证一个类. 只有一个实例存在,同时提供能对该实例加以访 问的全局访问方法. 二.为什么要使用单例模式呢? 在应用系统开发中,我们常常有以下需求: - 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象 - 在整个程序空间使用全局变量,共享资源 - 大规模系统中,为了性能的考虑,需要节

.NET设计模式-装饰模式(Decorator Pattern)

装饰模式(Decorator Pattern) --.NET设计模式系列之十 Terrylee,2006年3月 概述 在软件系统中,有时候我们会使用继承来扩展对象的功能,但是由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性:并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀.如何使"对象功能的扩展"能够根据需要来动态地实现?同时避免"扩展功能的增多"带来的子类膨胀问题?从而使得任何"功能扩展变化"所

解读设计模式----装饰模式(Decorator Pattern)

装饰模式(Decorator)也叫包装器模式(Wrapper).以"装饰"的含义生动形象地描绘了"动态地给一个对象添加一些额外的职责"的意图.GOF在<设计模式>一书中给出的定义为:动态地给一个对象添加一些额外的职责.装饰模式充分利用了继承和聚合的优势,创造出无与论比的设计美学.就增加功能来说,Decorator模式相比生成子类更为灵活. UML图: 一.使用Decorator模式的动机 现在有这样一个场景,要求我们为一个对象动态添加新的职责,这个职责并

设计模式-装饰模式遇到的问题,大神求教

问题描述 装饰模式遇到的问题,大神求教 求问大神一个关于设计模式的问题,我用装饰模式实现给一个人的具体对象穿衣服,穿鞋子,那么问题来了,我怎么实现把鞋子脱了 解决方案 装饰模式是对原有功能的增强,它的本质是不改变原有类结构的情况下对原来的某个功能的增强处理.所以就你描述的需求,它还是只能提供穿衣服,穿鞋子的原有功能,但是可能有增强操作,比如穿衣服之前先把衣服整平,穿鞋后擦擦鞋子.它不会凭空多出一个新功能的,因为它实现的还是你原有的接口,只是实现功能超过原有功能而已. 解决方案二: 求问大神一个关