设计模式--装饰者模式与代理模式

这次主要总结下装饰着模式和代理模式,这两个一起进行总结,主要是因为两个设计模式特别的类似。先依次说一下两个设计模式,然后再说下两个模式的不同。

1、装饰者模式

从例子开始讲解,比如今天你要出门约会,你肯定是要决定好你要穿什么样的衣服出门,用衣服来装饰下自己,让自己拥有一个完美的约会。比如,你会穿一件衬衫,然后穿一件西服裤,最后穿皮鞋出门。这就是装饰者模式的一个例子。为了实现这个功能,会有下面的代码。
public class People {
	
	public void wearShirt(){
		System.out.println("******穿衬衫******");
	}
	
	public void wearTrouser(){
		System.out.println("******穿西服裤******");
	}
	
	public void wearShoes(){
		System.out.println("******穿皮鞋******");
	}
}

public class Client {

	public static void main(String[] args) {
		People people = new People();
		people.wearShirt();
		people.wearTrouser();
		people.wearShoes();

	}

}

虽然上面的代码实现了出门穿衣服的功能,但是这里会问题。如果我现在要增加一个功能,我要先穿袜子,再穿皮鞋。此时就要在People类中增加一个穿袜子的方法。这就违背了设计模式的 开闭原则,所谓开闭原则就是类可以进行扩展,但是不可以进行修改。所以就有如下的设计:
public interface People {
	
	public void wearClothing();
	
}
public class Xiaoming implements People{
	
	private String name;
	
	public Xiaoming(){
		name = "小明";
	}
	public void wearClothing(){
		System.out.println(name+"******开始穿衣服******");
	}
	public String getName() {
		return name;
	}
	
}
public abstract class Finery implements People {
	
	protected People people;
	
	public Finery(People people){
		this.people = people;
	}
	public abstract void wearClothing();
}
public class ShirtFinery extends Finery {

	public ShirtFinery(People people){
		super(people);
	}
	@Override
	public void wearClothing() {
		people.wearClothing();
		System.out.println("******穿衬衫******");
	}

}
public class ShoesFinery extends Finery {

	public ShoesFinery(People people){
		super(people);
	}
	@Override
	public void wearClothing() {
		people.wearClothing();
		System.out.println("******穿皮鞋*******");
	}
	
}
public class TrouserFinery extends Finery {

	public TrouserFinery(People people){
		super(people);
	}
	@Override
	public void wearClothing() {
		people.wearClothing();
		System.out.println("******穿西服裤*******");
	}
	
}

public class Client {

	public static void main(String[] args) {
		People people = new Xiaoming();
		Finery shirtFinery = new ShirtFinery(people);
		Finery trouserFinery = new TrouserFinery(shirtFinery);
		Finery shoesFinery = new ShoesFinery(trouserFinery);
		shoesFinery.wearClothing();
	}

}

其结构图如下:

设计模式--装饰者模式与代理模式_第1张图片
People是定义了一个接口,用来添加具体的职责,而Xiaoming是具体的People,也就是被装饰的对象。对于Finery实现了People接口,进而对People进行扩展,而Finery的子类就是具体的装饰类,Finery中依赖People类,装饰的具体对象。 这就是所谓的装饰者模式。如果我要添加穿袜子的步骤,则只需要再添加一个实现类,完全不需要修改其他代码(Client是客户端类,肯定是要修改的)。

2、代理模式


代理模式相对来说简单点。跟装饰者模式很类似。比如你英雄联盟玩的正起劲,中午不想去餐厅买饭了,这个时候你就会麻烦你的舍友代你去买。程序代码如下。
public interface People {
  
	public void buyFood();
}

public class Xiaoming implements People {

	@Override
	public void buyFood() {
		System.out.println("小明饭已买回来");
	}

}
public class Xiaohong implements People {

	private People people;
	
	public Xiaohong(People people){
		this.people = people;
	}
	@Override
	public void buyFood() {
		System.out.println("帮别人去买饭");
		people.buyFood();
	}

}
public class Client {

	public static void main(String[] args) {

		People xiaoming = new Xiaoming();
		People xiaohong = new Xiaohong(xiaoming);
		xiaohong.buyFood();

	}

}
其结构图如下:

设计模式--装饰者模式与代理模式_第2张图片

这个图跟装饰着很类似。两者实现起来也基本一样,主要区别在于用途的区别。

3、两种模式的区别

装饰者模式主要是用来增加类的职责和行为的,将类的核心职责和装饰功能区分开,可以很方便对装饰功能进行添加和去除。
代理模式的用途主要有:1、虚拟代理,根据需要要创建开销很大的对象时,通过它来存放实例化需要很长时间的真实对象,这样可以达到性能的最优化。
2、安全代理,用来控制真实对象的访问权限,是否可以访问真实对象,比如xiaohong是否愿意帮xiaoming带饭。3、当调用真实对象时,代理对象处理一些其他的事,比如xiaohong帮xiaoming带饭,可以先收xiaoming的钱,然后再去带饭。还有其他的用途,这里不一一列举。
装饰者模式和代理模式设计的非常类似,不同就是用途的区别。





你可能感兴趣的:(java,设计模式)