装饰设计模式就是对已有的对象的功能进行增强
说白了就是为了避免继承带来的体积臃肿而产生的,
简单小例子:
[java] view plaincopy
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.
优化:
可以将缓冲技术单独抽取进行封装。
要缓冲区谁将谁和缓冲相关联即可。
这样的设计的相对体系会变的简单。
使用继承带来的局限性:
[java] view plaincopy
/*
房子:平房,楼房。
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();
}
}
使用装饰设计模式进行装饰:
[java] view plaincopy
/*
原体系:
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();
}
}
做的笔记,希望对你有帮助 |