java23设计模式---class06.装饰者模式(Decorator)

1、装饰者模式是什么

装饰者模式,顾名思义,是用于装饰的一种设计模式。

我们在这个背景下来思考:
有一条小狗,我们给它穿衣服,戴围巾怎么做呢?

  或许大多数新手都会用继承的方法,也就是先创建一个Dog类,然后建Dog_Clothes类去继承Dog就可以让小狗穿上衣服,Dog_Clothes_Scraft去继承Dog_Clothes就可以让穿上衣服的小狗戴上围巾。

  或许你会认为这种模式并无什么明显的弊端,但是,如果装饰多了的时候呢?比如我们再给这小狗戴上手套,戒指甚至给他上百个装饰的时候,这时就会产生大量的类从而出现类爆炸。这个例子告诉我们,继承类装饰这种方法在装饰品较多的情况下并不科学可行。那么,在装饰品不多的时候就可以使用继承装饰法吗?我们来看另一种情况,假如我们给狗戴上一枚戒指只需要Dog_Ring类,如果戴上第二枚戒指呢?可以用Dog_Ring_Ring去继承Dog_Ring,也可以直接用Dog_Ring_Ring去继承Dog呢,这两种方法显然都不方便拓展,假如我们还需要戴三只戒指的小狗,戴四只戒指的小狗,戴五只戒指的小狗呢?都需要新建一个类,并不具有良好的可拓展性,这是因为代码间的耦合度过高。那么,是否有一种方法可以使装饰品具有良好的拓展性呢?怎么在不过度增加系统负担的同时让小狗多穿几件衣服呢?这时我们从前辈大佬的经验中可以总结出一种设计模式:装饰品模式。

2、代码实现:

装饰者模式介绍:装饰者模式中主要涉及两种类,一是装饰器类,二是组件类,为了实现代码的拓展性,符合开闭原则:一个软件实体例如类,模块和函数应对拓展开放,对修改关闭,我们把装饰器类和组件类抽象出两个抽象类或者接口(形容词用接口,名词用抽象类),且抽象装饰类应该是组件抽象类的子类。

1、组件类

package pattern.decorate;
//动物抽象类
public abstract class BaseAnimals {
    
    
abstract String show();
}

2、组件实现类

package pattern.decorate;
//猫类
public class Cats extends BaseAnimals{
    
    

	@Override
	String show() {
    
    
		// TODO Auto-generated method stub
		return "cat";
	}

	@Override
	public String toString() {
    
    
		return "cat";
	}


}
ackage pattern.decorate;
//狗类
public class Dogs extends BaseAnimals{
    
    

	@Override
	String show() {
    
    
		// TODO Auto-generated method stub
		return "dog";
	}

	@Override
	public String toString() {
    
    
		return "dog";
	}

}

3、装饰器抽象类

package pattern.decorate;

public abstract class BaseAnimalsDecorator extends BaseAnimals{
    
    
private BaseAnimals animals;
public BaseAnimalsDecorator(BaseAnimals animals) {
    
    
	this.animals=animals;
}
@Override
String show() {
    
    
	return animals.show();
};
}

4、具体装饰器类

package pattern.decorate;

public class AddClothes extends BaseAnimalsDecorator{
    
    
	public AddClothes(BaseAnimals animals) {
    
    
		super(animals);
		// TODO Auto-generated constructor stub
	}

	@Override
	String show() {
    
    
		// TODO Auto-generated method stub
		return (super.show()+"+衣服");
	}

	@Override
	public String toString() {
    
    
		return super.show();
	}

}
package pattern.decorate;

public class AddScraf extends BaseAnimalsDecorator{
    
    

	public AddScraf(BaseAnimals animals) {
    
    
		super(animals);
		// TODO Auto-generated constructor stub
	}
	@Override
	String show() {
    
    
		// TODO Auto-generated method stub
		return super.show()+"+围巾";
	}
}

5、测试类

package pattern.decorate;

public class DecoratePatternTest {
    
    
public static void main(String[] args) {
    
    
	BaseAnimals dogs=new Dogs();
	//给狗穿一件衣服
    dogs=new AddClothes(dogs);
    //给小狗再穿一件衣服
	dogs=new AddClothes(dogs);
	//给狗戴一件围巾
	dogs=new AddScraf(dogs);
	System.out.println(dogs.show());
}
}

结果:
在这里插入图片描述
类的关系图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_51801058/article/details/113702088