大话设计模式之装饰者模式

需求:设计一个系统,可以给人装饰不同的服饰,例如:帽子,T恤,背心,帆布鞋等等。

分析:我们都知道人的服饰是各种各样的,是不确定的,也就是说不同的人可以有不同的装饰,一个人也可以换不同的服饰,要设计这样一个可以动态换服饰的系统,我们会选择使用装饰者模式来设计,这是一个经典的设计模式,相信很多人都知道。

设计步骤:

第一步:创建对象Person,也就是我们需要装饰的对象,对象里面有一个属性name,就是人的名字,提供getter和setter方法,人还有一个show()方法,就是显示自己的服饰的一个行为。

public class Person {
	
	private String name;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void show() {
		System.out.println("装扮的" + this.name);
	}
}
第二步:抽象出一个服饰类Finery,继承Person类, 对人进行装饰,也就是把人和服饰分离开,进而可以给人动态选择不同的服饰,在Finery类里面存放一个Person属性,可以通过decorate方法动态设置需要修饰的Person对象,同时重写父类的show方法。

//服饰类,对人进行修饰
public class Finery extends Person {

	private Person component;
	
	public void decorate(Person component) {
		this.component = component;
	}

	@Override
	public void show() {
		if (component != null) {
			component.show();
		}
	}
	
}
第三步:创建三个不同的服饰,分别是TShirts,BigTrouser, Sneakers,这三个类都继承Finery类,重写父类的show方法,重写的时候,先添加服饰的特点,然后调用父类的show方法。

public class TShirts extends Finery {

	@Override
	public void show() {
		System.out.println("大T恤");
		super.show();
	}
	
}
public class BigTrouser extends Finery {

	@Override
	public void show() {
		System.out.println("垮裤");
		super.show();
	}
	
}
public class Sneakers extends Finery {

	@Override
	public void show() {
		System.out.println("破球鞋");
		super.show();
	}
	
}
第四步:最后肯定就是测试了,例如现在小明要装饰自己,要穿T恤,垮裤,还有鞋子。我们先创建一个Person对象,然后创建三种不同的服饰,依次对小明进行修饰,最后显示小明的装饰,装饰的过程其实是一个递归过程,好好体会,如果现在小明需要更换不同的服饰的话,只需要添加添加新的服饰类,然后对小明进行装饰就行了,如果我们不使用装饰者模式,不对人和服饰进行分离的话,我们需要修改的代码时很多的,不妨试试~~
//测试
public class Test {
	
	public static void main(String[] args) {
		Person xiaoming = new Person();
		xiaoming.setName("小明");
		TShirts ts = new TShirts();
		BigTrouser bt = new BigTrouser();
		Sneakers sk = new Sneakers();
		
		//装饰过程
		ts.decorate(xiaoming);
		bt.decorate(ts);
		sk.decorate(bt);
		
		sk.show();
	}
	
}
程序运行的结果如下:
破球鞋
垮裤
大T恤
装扮的小明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值