• 装饰者模式




    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();
    }
    
    吃饭前洗手
    狗吃肉
    我的狗狗还能打怪兽
    

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



  • 相关阅读:
    Haskell Types与Typeclasses
    Haskell Tuple相关总结
    Haskell List相关操作
    Emacs 常用快捷键
    Emacs 参考资料
    Haskell Platform (windows)
    生成zip压缩包
    递归复制一个文件
    写表格
    读表格
  • 原文地址:https://www.cnblogs.com/Howlet/p/12020604.html
Copyright © 2020-2023  润新知