`
dawuafang
  • 浏览: 1100537 次
文章分类
社区版块
存档分类
最新评论

装饰设计模式

 
阅读更多
装饰设计模式就是对已有的对象的功能进行增强

简单小例子:

class Person
{
	void chifan()
	{
		System.out.println("chifan");
	}
}

/*
为了不随便改变原有的代码。
还要增强chifan功能。
那么就定义一个类,对原有对象进行装饰。
*/
class NewPerson
{
	private Person p;
	NewPerson(Person p)
	{
		this.p = p;
	}
	public void newChifan()
	{	
		System.out.println("来一杯");
		p.chifan();
		System.out.println("来一根");
	}
}

class  PersonDemo
{
	public static void main(String[] args) 
	{
		Person p = new Person();
		
		//NewPerson np = new NewPerson(p);
		//np.newChifan();

		p.chifan();
	}
}


我们考虑一下使用继承也可以对父类中的功能进行增强只需要调用super就可以调用父类的方法,那使用装饰和继承有什么区别?
使用继承体系就会有点臃肿,因为当平房想要改成欧式时,还要建立子类。

Writer
|--FileWriter
|--BufferedFileWriter。
|--DataWriter
|--BufferedDataWriter。
|--MediaWriter
|--BufferedMediaWriter.

优化:
可以将缓冲技术单独抽取进行封装。
要缓冲区谁将谁和缓冲相关联即可。
这样的设计的相对体系会变的简单。

使用继承带来的局限性:

/*
房子:平房,楼房。

House
	|--PingFang
	|--LouFang


准备对房子进行装修。

	1,对平房进行田园风光式的打造。
	2,对楼房进行欧式风格的打造。
可以用继承的方式来完成。
House
	|--PingFang
		|--TianYuanPingFang
	|--LouFang
		|--OuShiLouFang

	
该体系就有点臃肿,因为当平房想要改成欧式时,还要建立子类。
*/
abstract class House
{
	abstract void show();
}

class PingFang extends House
{
	public void show()
	{
		System.out.println("平房");
	}
}

class TianYuanPingFang extends PingFang
{
	public void showTianYuan()
	{
		super.show();
		System.out.println("田园风格");
	}	
}

class LouFang extends House
{
	public void show()
	{
		System.out.println("楼房");
	}
}
class OuShiLouFang extends LouFang
{
	public void showOuShi()
	{
		super.show();
		System.out.println("欧式风格");
	}
}



class  HouseDemo
{
	public static void main(String[] args) 
	{
		PingFang p = new PingFang();
		///p.show();

		TianYuanPingFang t = new TianYuanPingFang();
		t.showTianYuan();


		LouFang l = new LouFang();
		//l.show();
		OuShiLouFang o = new OuShiLouFang();
		o.showOuShi();
	}
}

使用装饰设计模式进行装饰:

/*

原体系:
House
	|--PingFang
	|--LouFang
无论将平房打造成田园还是欧式,都是对平房一种装修。
而该装修也可以用楼房。

将现将该装修定义好,需要把什么房子进行改装修,传入即可。
House
	|--PingFang
	|--LouFang
	|--TianYuan
	|--OuShi

*/
abstract class House
{
	abstract void show();
}

class PingFang extends House
{
	public void show()
	{
		System.out.println("平房");
	}
}


class LouFang extends House
{
	public void show()
	{
		System.out.println("楼房");
	}
}


class TianYuan extends House
{

	private House h;
	TianYuan(House h)
	{
		this.h = h;
	}
	public void show()
	{
		System.out.println("田园风格");
	}

	public void showTianYuan()
	{
		h.show();
		this.show();
	}

}


class OuShi extends House
{
	private House h;
	OuShi(House h)
	{
		this.h = h;
	}
	public void show()
	{
		System.out.println("欧式风格");
	}

	public void showOuShi()
	{
		h.show();
		this.show();
	}

}

class  HouseDemo2
{
	public static void main(String[] args) 
	{
		PingFang p = new PingFang();
		LouFang l = new LouFang();

		OuShi o = new OuShi(new TianYuan(p));
		o.showOuShi();

		//TianYuan t = new TianYuan(l);
		//t.showTianYuan();

		//OuShi o = new OuShi(l);
		//o.showOuShi();
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics