装饰模式

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

装饰模式的组成:
1、抽象组件(Component):定义一个接口,可以给这些对象动态的添加职责,是被修饰者。

2、具体组件(ConcreteComponent):继承自抽象组件的具体对象,也可以给这个对象添加一些职责。

3、装饰者(Decorator):装饰抽象类,用于扩展Component的功能,但对于Component来说,不必知道装饰者的存在。

4、具体装饰者(ConcreteDecorator):具体的装饰对象,起到给Component添加功能的职责。

装饰模式uml图:
装饰模式uml图

实例代码如下:

//定义被修饰者
public interface Human {

    public void show();
}

// 定义具体的被修饰者,被修饰者开始有自己的一些修饰
public class Person implements Human {

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

    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.println("装扮的" + name);
    }
}

// 定义修饰者
public class Finery implements Human {

    protected Human human;
    public Finery() {
        // TODO Auto-generated constructor stub
    }

    public void Decorate(Human human){
        this.human = human;
    }

    @Override
    public void show() {
        // TODO Auto-generated method stub
        human.show();
    }
}

// 定义两个具体的修饰者类
public class Tshirts extends Finery{

    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.println("T恤");
        super.show();
    }
}

public class BigTrouser extends Finery{

    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.println("垮裤");
        super.show();
    }
}

// 客户端使用

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Tshirts tshirts = new Tshirts(); 
        BigTrouser bigThouser = new BigTrouser();
        Person person = new Person("大磊");

        bigThouser.Decorate(person);
        tshirts.Decorate(bigThouser);

        tshirts.show();
    }

}

uml图:
这里写图片描述

分析:装饰模式是为了能够动态的添加更多的功能的一种方式。当新加的功能仅仅是为了满足一些只在某种特定情况下才会执行,用修饰模式正好合适。修饰模式把每个要装饰的的功能放在一个类里,并让这些类包装所要修饰的对象,因此,当执行特殊行为时,客户端代码可在运行时根据需要有选择地,按顺序地使用装饰功能包装对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值