设计模式之装饰模式(笔记)

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

装饰模式适用场合:当需要给系统添加新的功能时,而这些添加的功能仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要,它把每个装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户端就可以在运行时候根据需要有选择地、按顺序地使用装饰功能包装对象。

以小明搭配衣服为例。

定义一个IPerson接口

public interface IPerson {

    public void show();
}

定义一个具体对象Person

public class Person implements IPerson {

    private String name;
    public Person(){

    }
    public Person(String name){
        this.name=name;
    }

    @Override
    public void show() {
        System.out.println("打扮的"+name);
    }
}

定义一个装饰类Finery继承IPerson

public class Finery implements IPerson{

    protected IPerson person;

    //打扮
    public void decorate(IPerson person){
        this.person=person;
    }

    @Override
    public void show() {
        if(person!=null){
            person.show();
        }
    }
}

定义若干个具体的装饰对象,继承装饰类Finery

public class Tshirt extends Finery {

    public void show(){
        System.out.print("T恤衫,");
        super.show();
    }
}

public class Trouser extends Finery{

    public void show(){
        System.out.print("裤子,");
        super.show();
    }
}

public class LeaterShoes extends Finery{

    public void show(){
        System.out.print("皮鞋,");
        super.show();
    }
}

public class NetShoes extends Finery {

    public void show(){
        System.out.print("网鞋,");
        super.show();
    }
}

public class Suit extends Finery{

    public void show(){
        System.out.print("西装,");
        super.show();
    }
}

客户端代码

public static void main(String[] args) {

        //装饰模式
        Person person=new Person("小明");

        //第一种装扮
        System.out.println("第一种装扮 :");
        NetShoes nShoes=new NetShoes();//T恤衫
        Trouser trouser=new Trouser();//裤子
        Tshirt tshirt=new Tshirt();//网鞋

        nShoes.decorate(person);
        trouser.decorate(nShoes);
        tshirt.decorate(trouser);

        tshirt.show();

        //第二种装扮
        System.out.println("第二种装扮 :");
        LeaterShoes lShoes=new LeaterShoes();//西装
        Trouser nTrouser=new Trouser();//裤子
        Suit suit =new Suit();//皮鞋

        lShoes.decorate(person);
        nTrouser.decorate(lShoes);
        suit.decorate(nTrouser);

        suit.show();
        }

结果显示:

第一种装扮 :

T恤衫,裤子,网鞋,打扮的小明

第二种装扮 :

西装,裤子,皮鞋,打扮的小明

时间: 2024-11-07 23:48:49

设计模式之装饰模式(笔记)的相关文章

跟我学设计模式视频教程——装饰模式,装饰模式VS代理模式

课程视频 装饰模式 装饰模式VS代理模式1 装饰模式VS代理模式2 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--装饰模式,装饰模式VS代理模式,布布扣,bubuko.com

易学设计模式看书笔记(1) - 设计模式的分类

1 创建型模式 单独对对象的创建进行研究,高效的创建对象就是创建型模式讨论的问题.创建型设计模式有6种: 简单工厂模式(simple factory): 工厂方法模式(factory method): 抽象工厂模式(abstract factory): 创建者模式(Builder): 原型模式(Prototype): 单例模式(Singleton). 2 结构型模式 在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了关注的焦点,因为如何设计对象之间的结构.继承和依赖关系会影响到后

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

易学设计模式看书笔记(2) - 简单工厂模式

本文摘自易学设计模式一书 一.简单工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } public class D

《Head First 设计模式》学习笔记——适配器模式 + 外观模式

在ADO.NET中,对于我们从数据库中取出的数据都要放到一个DataSet中,不管你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供如:SqlDataSet.OleDbDataSet.OracleDataSet等,它只提供了一种DataSet就是用SqlDataAdapte等去填充数据:为什么这一个DataSet能存放不同的数据呢?就是有这些适配器来适配.----题记 设计模式 适配器模式:将一个类的接口,转换成客户期待的另一个

《Head First 设计模式》学习笔记——模板方法模式

模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 设计模式 模板方法模式:在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结果的情况下,重新定义算法中的某些步骤. 模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现.这样可以确

设计模式之装饰模式20170726

结构型设计模式之装饰模式: 一.含义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 通俗来讲,装饰模式是对类的功能进行加强或减弱. 二.代码说明 1.主要有两个角色 1)构件 最核心.最原始.最基本的对象,也就是要装饰的对象. 2)装饰角色 把最核心.最原始.最基本的东西装饰成其他东西 2.在用C实现过程中也是参考这种思想,以修饰成绩单举例,具体实现如下: 1)装饰模式使用场景: 1 /***********************************

《Head First 设计模式》学习笔记——策略模型

我们全都使用别人设计好的库与框架.我们讨论库与框架.利用他们的API编译成我们的程序.享受运用别人的代码所带来的长处.看看java api它所带来的功能:网络.GUI.IO等.库与框架长久以来,一直扮演着软件开发过程的重要角色,我们从中挑选所要的组件,把他们放进合适的地方.可是,库与框架无法帮助我们将应用组织成easy了解.easy维护.具有弹性的架构,所以要设计模式. 设计模式不会直接进入你的代码中,而是先进入你的"大脑"中.一旦你先在脑海中装入了很多关于模式的知识,就行開始新设计中

易学设计模式看书笔记(4) - 抽象工厂模式

 本文内容来自书上,不懂设计模式,只求混个眼熟. 三.抽象工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } pu

设计模式之装饰模式 c++实现和详细分析

Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 它使功能具有动态性 已经开发完毕的对象,后期由于业务需要,对旧的对象需要扩展特别多的功能,这时候使用给对象动态地添加新的状态或者行为(即装饰模式)方法,而不是使用子类静态继承. 引入装饰模式的原因  : 由于若有很多个功能,这么多功能 可能会出现各种组合,而每个组合都要对应一个类,这是指数级的类的数量增长(因为我们要扩展不应直接修改类,所以采取继承 而不是改变原有类)