穿什么有这么重要?——装饰模式

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

装饰模式(Decorator)结构图

  Component是定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。

Component类

abstract class Component{
    public abstract void Operation();
}

ConcreteComponent类

class ConcreteComponent extends Component{
    public void Operation(){
        //具体对象的操作
    }
}

Decorator类

class Decorator extends Component{
    protected Component component;

    public void SetComponet(Component component){
        this.component = component;
    }

    public void Operation(){
        if(component != null){
            component.Operation();
        }
    }

}

ConcreteDecoratorA类

class ConcreteDecoratorA extends Decorator{
    private string addedState;

    base.Operation();
    addedState = "New State";
    //具体装饰对象A的操作

}

class ConcreteDecoratorB extends Decorator{
    public void Operation(){
        base.Operation();
        AddedBehavior();
        //具体装饰对象B的操作
    }

    private void AddedBehavior(){
        //本类独有的方法,以区别与ConcreteDecoratorA
    }

}

客户端代码:

static void Main(String[] args){
    ConcreteComponent c = new ConcreteComponent();
    ConcreteDecoratorA d1 = new ConcreteDecoratorA();
    ConcreteDecoratorB d2 = new ConcreteDecoratorB();
    //装饰方法:首先用ConcreteComponent实例化对象c,然后用ConcreteDecoratorA的实例化对象d1来包装c
    //然后利用ConcreteDecoratorA的实例化对象d1来包装c,再利用ConcreteDecoratorB的对象d2包装d1,
    //最终执行d2的Operation()
    d1.SetComponet(c);
    d2.SetComponet(d1);
    d2.Operation();
}

  装饰模式是利用SetComponent来对对象进行包装,这样每个装饰对象的实现就和如何利用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。

时间: 2024-08-01 13:17:15

穿什么有这么重要?——装饰模式的相关文章

设计模式学习-装饰模式

1.什么是装饰模式 装饰模式,在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.动态地给一个对象添加一些额外的职责.这样是能够把类中的装饰功能从类中搬移出去,这样可以简化原有的类.有效地把类的核心功能和装饰功能区分开了. 2.装饰模式的实现 在本例子中,举例最常见的人穿衣服的例子,首先我们定义这样一个Person的基类,如下: #include <cstdio> #include <string> #include

7 结构型模式之 - 装饰模式

装饰模式介绍:装饰模式也称为包装模式,是结构型模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一.在现实生活中你也可以看见很多装饰模式的例子,或者可以大胆地说装饰模式无处不在,就拿人来说,人需要各式各样的衣着,不管你穿着怎样,但是,对于个人的本质来说是不变的,充其量只是在外面披上一层包装而已,这就是装饰模式,装饰物也许各不相同但是装饰的对象本质是不变的. 装饰模式的定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更加灵

JAVA设计模式:装饰模式

前面我们学习了代理模式: 代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口. 本次我们学习下装饰模式: 装饰模式又称为包装模式,装饰模式以对客户端透明的方式扩展对象功能,相对于代理而言,代理是不让客户端知道真实对象的信息,装饰模式是基层关系的一个替代方案. 装饰模式是采用对客户端透明的方式动态的给一个对象添加了更多职责,对于原来被装

设计模式——装饰模式

场景设置 我早上起床,光着身子.这时我要穿衣服,先穿裤子再穿上衣. 我该怎么实现这个过程呢? 首先我是一个赤裸裸的人,并且我能被别人看到: class Person { protected String name; protected String body; public void show(){ System.out.println("身体"); } } 然后,我要先穿裤子: class Trousers extends Person{ private Person person;

《大话设计模式》ruby版代码:装饰模式

需求: 给人搭配不同的服饰 代码版本一 # -*- encoding: utf-8 -*- class Person attr_accessor :name def initialize(name) @name = name end def wear_t_shirts puts '大T恤' end def wear_big_trouser puts '垮裤' end def wear_sneakers puts '破球鞋' end def wear_suit puts '西装' end def

简单说说装饰模式

这里只简单说说装饰模式,因为对这个模式理解得还不是很透彻.暂时不能写出更深一点的内容. 什么是装饰模式呢?拟定一个场景,一个人需要穿衣打扮,我们可以写一个Person类,为它定义出N个方法,穿短袖,穿皮鞋,等等.要新增一个装饰的时候,我们在Person类里新增一个方法即可,但这违背了“方法-封闭”原则.如何写出更好更加灵活的代码呢?我们用装饰模式来实现这个场景.小明先穿短袖,后穿皮鞋. 穿短袖.穿皮鞋等等,我们把这些装饰方法干脆抽象出来成一个装饰类,不同的装饰继承实现这个类.人定义为一个接口,小

设计模式4:装饰模式(1)

作用: 基于已经存在的功能提供增强功能. 将扩展的类作为新的类的构造函数参数传入,然后对这个类进行装饰处理. 为了让装饰者有被装饰的功能,需要存在继承关系. 简单的点讲就是为了扩展一个已定义好的类的功能,而不修改原来类的定义,原来的类仍然可以继续使用,现在定义一个新的类继承原来的类,同时在这个新的类中定义父类的成员变量,同时在构造方法中将外界的一个父类对象传给这个成员变量,然后既可以通过这个成员变量使用父类的方法,同时又可以增加新的方法实现对父类功能的扩充.例如IO流中很多类都采用了装饰模式,如

设计模式3:装饰模式

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀. 为了避免子类数量的快速膨胀,我们可以用装饰模式为对象动态的增加功能. 这些功能应该是没有相互关联和先后顺序的. 举例来说,一个人可以穿各种不同的装扮,如果为每套打扮生成一个子类,那么子类

第 6 章 装饰模式

1:背景介绍--小菜穿衣服 做法1: 定义Person类,依次调用方法 弊端:违背了开放--封闭的原则. 做法2: 定义Person类,定义服饰抽象类,具体类继承抽象类. 弊端:客户端调用重复代码太多,功能没分离开来,不方便添加新的功能. 客户端调用: 需要把所需要的功能按正确的顺序串联起来进行控制 做法3(装饰模式): 动态的给每个对象添加一些额外的职责,就增加功能上来说,装饰模式比生成子类更加方便. Component是定义一个对象接口,可以给这些对象动态的地添加职责.ConcreteCom