其他分享
首页 > 其他分享> > 设计模式-装饰者模式

设计模式-装饰者模式

作者:互联网

1.装饰者模式

1.1装饰者模式介绍

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

装饰者设计模式

如图看上去有点像套娃,而装饰器的核心是再不改变原有类的基础上添加功能,有的同学就想到用继承、AOP切面,当然都可以实现,单单继承实现是有局限性的,且会造成子类过多,AOP实现较为复杂。装饰者模式会是一种更加灵活的思路,都避免了以上问题。

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

用例场景:1、毛坯房装修的豪华靓丽,本质还是钢筋水泥。2、孙悟空拥有72变,当变成其他动物的时候,本质还是猴子。

1.2案例场景

描述:猪(Pig)和鸭(Duck)都属于动物(Animal),他们都会吃饭(eat)。在不改变他们本质的情况下,给这些动物增加跑(run)和飞(fly)的功能。

实现:

场景代码实现:

1)创建基础接口和类:Animal接口、Pig类、Duck类

/**
 * 动物接口
 */
public interface Animal {
	void eat();
}

/**
 * 猪类
 */
public class Pig implements Animal {
	@Override
	public void eat() {
		System.out.println("Pig: eat");
	}
}

/**
 * 鸭类
 */
public class Duck implements Animal {
	@Override
	public void eat() {
		System.out.println("Duck: eat");
	}
}

2)创建AnimalDecorator抽象装饰器类和OtherAnimalDecorator装饰器类,用于扩展fly和run的功能。

/**
 * 动物装饰器类实现动物接口
 */
static abstract class AnimalDecorator implements Animal {
	// 动物实现接口
	protected Animal animal;
	// 用于实例化,触发实现该接口的类
	public AnimalDecorator(Animal animal) {
		this.animal = animal;
	}
}

/**
 * 继承装饰器类,用于扩展功能
 */
public class OtherAnimalDecorator extends AnimalDecorator {
	// 实例化的时候传入对应的动物,用于调用对应的方法
	public OtherAnimalDecorator(Animal animal) {
		super(animal);
	}
	// 给传入的动物赋予其他功能
	@Override
	public void eat() {
		animal.eat();
		fly();
		run();
	}
	public void fly() {
		System.out.println("Animal: fly");
	}
	public void run() {
		System.out.println("Animal: run");
	}
}

/**
 * 使用OtherAnimalDecorator装饰AnimalDecorator类
 */
public class DecoratorTest {
	public static void main(String[] args) {
		Animal pig = new Pig();
		Animal duck = new Duck();
        
		AnimalDecorator otherPig = new OtherAnimalDecorator(pig);
		AnimalDecorator otherDuck = new OtherAnimalDecorator(duck);
        
		System.out.println("===========pig==========");
		pig.eat();
		System.out.println("===========duck==========");
		duck.eat();
		System.out.println("===========otherPig==========");
		otherPig.eat();
		System.out.println("===========otherDuck==========");
		otherDuck.eat();
	}
}

3)输出如下:

===========pig==========
Pig: eat
===========duck==========
Duck: eat
===========otherPig==========
Pig: eat
Animal: fly
Animal: run
===========otherDuck==========
Duck: eat
Animal: fly
Animal: run

1.3总结

参考:《重学Java设计模式》

标签:Pig,eat,AnimalDecorator,模式,装饰,Animal,设计模式,public
来源: https://www.cnblogs.com/cnwanj/p/16172324.html