随机名言

装饰者模式



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

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



posted @ 2019-12-11 09:26  Howlet  阅读(866)  评论(0编辑  收藏  举报

Copyright © By Howl