大话设计模式之装饰模式

参考—>《大话之设计模式》感谢作者—org
先看一下结构图
这里写图片描述

装饰模式
如果只有一个ConcreteComponent类而没有抽象的Component类,那么
Decorator类可以是ConcreteComponent的一个子类
(在这儿的代码就是把Person这个ConcreteComponent类和Finery 这个Decorator类建立了父子关系)
同理
如果只有一个ConcreteDecorator那么也没必要建立一个单独的Decorator
类,而且可以把Decorator和ConcreteDecorator的责任合并成一个类。

这里写图片描述

代码—>
Person.java (ConcreteComponent)

package co.jp.li.concretecomponent;

public class Person {

    private String name;

    public Person() {
        super();
    }

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

    public void show(){
        System.out.print("を着ている"+this.name);
    }

}

Finery.java(decorator)

package co.jp.li.decorator;

import co.jp.li.concretecomponent.Person;

public class Finery extends Person {

    protected Person person;

    public void Decorate(Person person) {
        this.person = person;
    }

    @Override
    public void show() {
        // TODO Auto-generated method stub
        if (person != null) {
            person.show();
        }

    }

}

BigTrouser.java 和Kimono.java 和TShirt.java

package co.jp.li.concretedecorator;

import co.jp.li.decorator.Finery;

public class BigTrouser extends Finery {

    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.print("BigTrouser" + "\t");
        super.show(); 
    }
}

package co.jp.li.concretedecorator;

import co.jp.li.decorator.Finery;

public class Kimono extends Finery {

    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.print("着物\t");
        super.show();
    }


}

package co.jp.li.concretedecorator;

import co.jp.li.decorator.Finery;

public class TShirt extends Finery {

    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.print("TShirt" + "\t");
        super.show(); 
    }

}

coursom.java 客户测试类—>

package co.jp.li.client;

import co.jp.li.concretecomponent.Person;
import co.jp.li.concretedecorator.BigTrouser;
import co.jp.li.concretedecorator.Kimono;
import co.jp.li.concretedecorator.TShirt;

public class coursom {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Person person = new Person("佐藤");
        System.out.print("衣装は--->");
        TShirt tShirt = new TShirt();
        BigTrouser bigTrouser = new BigTrouser();
        Kimono kimono = new Kimono();

        bigTrouser.Decorate(person);
        tShirt.Decorate(bigTrouser);
        kimono.Decorate(tShirt);
        kimono.show();
    }

}

总结—
装饰模式是为已有功能动态地添加更多功能的一种方式。
使用场合—
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的
核心职责或主要行为,在主类中加入新的字段,方法,逻辑,从而增加了主类的复杂度。
装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装他所要修饰的对象,因此,当需要执行特殊行为时,客户代码可以在运行时根据需要有选择地,按顺序的使用装饰功能包装对象了。

装饰顺序很重要!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值