装饰者模式

最后都变了- 提交于 2019-12-11 09:46:31


1. 装饰者模式(Decorator Pattern)

定义

在不改变原代码结构的情况下,动态地扩展一个对象的功能,相比继承有更灵活的实现方式。见名知意,其就是在需要增强功能的对象上包装一层代码,达到增强功能的效果


作用

装饰者模式在对象创建好之后才动态给对象增加功能,也可以选择不增加,自由灵活。而继承是在对象创建时就已经确定,继承如果要扩展功能,因为单继承原因需要多重继承,会显得麻烦臃肿


2. 实现


准备

一条汪的接口

public interface Dog {
    abstract void eat();
}

某汪的实现类

public class MyDog implements Dog {
    public void eat() {
        System.out.println("狗吃肉");
    }
}


下面我们使用装饰者模式给狗狗增加功能

2.1 首先得有装饰器

//实现Dog接口
public abstract class DogDecorator implements Dog {

    private Dog dog;
    
    //用构造方法来获取需要增强功能的狗狗
    public DogDecorator(Dog dog) {
        this.dog = dog;
    }

    //调用父类狗狗的功能
    public void eat() {
        dog.eat();
    }
}


2.2 用装饰器来增强功能

我们想狗狗在吃饭前洗手,需要增加洗手的功能

//继承装饰类
public class WashHandDog extends DogDecorator {

    public WashHandDog(Dog dog) {
        super(dog);
    }
    
    //需要增强的功能
    public void WashHand(){
        System.out.println("吃饭前洗手");
    }

    //重写方法
    public void eat(){
        WashHand();
        super.eat();
    }
}

现在还想狗狗吃完饭能去打怪兽

public class BeatMonster extends DogDecorator {

    public BeatMonster(Dog dog) {
        super(dog);
    }
    
    public void BeatMonster(){
        System.out.println("我的狗狗还能打小怪兽");
    }
    
    public void eat(){
        super.eat();
        BeatMonster();
    }
}


2.3 升级版狗狗出现

public static void main(String[] args) {
        
        Dog mydog = new MyDog();
        mydog = new WashHandDog(mydog);
        mydog = new BeatMonster(mydog); 
        mydog.eat();
}
吃饭前洗手
狗吃肉
我的狗狗还能打怪兽

至此我们的装饰者模式就搞定了,是不是很简单,以后遇到增强功能的需求时可以想一想装饰者模式




标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!