java设计模式--装饰模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36594703/article/details/81360670

1.什么是装饰模式?

动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活。装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能,通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取,在面向对象的设计中,我们应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合方式,可以很灵活的给对象添加所需的功能,装饰器模式的本质就是动态组合,动态是手段,组合才是目的,总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来动态组合的这样一个模式,他使得我们可以给某个对象而不是整个类添加一些功能。

2.需求游戏中有不同的角色,然后不同的角色有不同的搭配,这里创建两个角色法师和猎人,对他们进行装饰穿衣服,穿裤子,装饰头发等等。

描述信息的接口RoleDescription:

public interface RoleDescription {
	public String describe();//描述角色信息
}

所有具体装饰类的父类AbstractDecorate是一个抽象类:

//所有具体装饰类的父类
public abstract class AbstractDecorate implements RoleDescription{
	//持有被装饰者实现的接口的引用
	private RoleDescription rd;
	public AbstractDecorate(RoleDescription rd) {
		this.rd=rd;
	}
	public String describe() {
		return rd.describe();
	}
}

穿裤子的实现类PlantDecoration:

public class PlantDecoration extends AbstractDecorate{
	public PlantDecoration(RoleDescription rd) {
		super(rd);
	}
	public String describe() {
		return super.describe()+"穿上了裤子";
	}
}

穿上衣的实现类JacketDecoration:

public class JacketDecoration extends AbstractDecorate{
	public JacketDecoration(RoleDescription rd) {
		super(rd);
	}	
	public String describe() {
		return super.describe()+"穿上了上衣";
	}
}

创建法师角色的类Magic:

public class Magic implements RoleDescription{
	@Override
	public String describe() {
		return "法师";
	}
}

创建猎人角色的类Hunter:

public class Hunter implements RoleDescription{
	@Override
	public String describe() {
		return "猎人";
	}	
}

测试类TestDecoration:

public class TestDecoration {
	public static void main(String[] args) {
		RoleDescription rd=new Magic();
		System.out.println(rd.describe());
		//穿上衣
		JacketDecoration jacketDecoration=new JacketDecoration(rd);
		String result=jacketDecoration.describe();
		System.out.println(result);
		//穿鞋子
		PlantDecoration plantDecoration=new PlantDecoration(jacketDecoration);
		result=plantDecoration.describe();
		System.out.println(result);
		//装饰一个猎人
		System.out.println("----------------");
		RoleDescription target=new PlantDecoration(new JacketDecoration(new HairDecoration(new Hunter())));
		System.out.println(target.describe());
	}
}

猜你喜欢

转载自blog.csdn.net/qq_36594703/article/details/81360670