说到装饰者模式很多人都感觉很难理解,到底什么是所谓的装饰?
在这里,我先谈一谈我个人的理解吧。
所谓装饰,那就是在不改变原先状态的情况下,给某个对象或者说某个东西添加一些的额外的属性,来增加其使用,前提一定是不影响原先的结构,给原先的状态增加一些扩展性,从网上也查找了很多关于装饰者模式的使用和介绍,但是,太过于官方了,实在是看不太懂,只能按照自己的理解来写这一篇文章了。
说到这里我先写一个例子:
先描述一下基本的三个基本:
1,接口,
2,接口的实现类
3,包装了实现类的装饰类。
那么我们先创建一个接口,比如,我们需要一个打电话的基本功能。我们在接口中创建一个描述方法用来对功能进行描述:
接着创建两个实现类,实现这个电话类:
public interface IPhone{
String Decribe();
}
创建电话类:android手机类,苹果手机类
public class AndroidPhone implement IPhone{
@override
public Stirng Describe(){
return "安卓手机可以打电话";
}
}
public class ApplePhone implement IPhone{
@override
public String Descibe(){
return “苹果手机可以打电话”;
}
}
这样两个类就实现了,接下来,我们需要对两个类进行包装,在不失去基本功能的前提下,将他们装饰起来,好的创建一个装饰类,
public class ZSPhone implement IPhone{
private IPhone mPhone;
public ZSPhone (Iphone phone){
this.mPhone=phone;
}
@ovverride
public String Describe(){
return mPhone.call();
}
}
这样就完成了,现在我们来分析一下这样写的好处和为什么要这样写?
我们只需要在调用的时候这样调用
ZSPhone zdPhone=new ZSPhone(new AndroidPhone() );
zdPhone.Call();
ZSPhone zsPhone=new ZSPhone(ApplePhone());
ZdPhone.Call();
因为他的返回值是调用的其参数对象的call方法,所以,这样并未影响到其本身的功能。只是我们需要用装饰类来调用而已。
首先,如果有多个电话种类想要实现打电话的功能其实很简单,只需要将所有的电话种类实现上边的接口即可,我们这样写是不是多此一举呢??????
我们之所以这样写是为了以后的扩展性,比方说,我后来又需要发短信的功能,我需要创造四个不同类型的手机,一个具有打电话,发彩信的android手机,一个打电话发短信的android手机,一个打电话发短信的苹果手机,一个打电话发彩信的苹果手机,那么如何实现呢???
如果我们再创建发短信的接口,和发彩信的接口,让他们继承,但是,少的话可以这样,如果有多个种类的手机需要这样咋办,那不得敲代码敲死???速度还慢》
》》》》》》》简单的方法来了,如果我们再用同样的方式,将上边的在进行一下包装,
创建短信类,继承自上边的装饰类,这样他也具有了描述的功能:在构造中调用父类的构造,
public class ColorMessage extands ZSPhone{
public ColorMessae(IPnhe phone){
super(phone)
}
//调用了父类的构造后,在重写的方法中,再调用返回父类的打电话功能后,给他补充上发彩信的功能,这样就完成一个,下面我们分别为完成剩下的一个吧?
@Override
public String Decrible(){
return super.decrible()+"发彩信的功能"
}
}
public class ShortMessage extands ZSPhone{
public ShortMessae(IPnhe phone){
super(phone)
}
@Override
public String Decrible(){
return super.decrible()+"发短息的功能"
}
}
这样我们只需要再点用的时候多次扮装就可以了:如下
ZSPhone zdPhone=new ZSPhone(new AndroidPhone(new ColorMessage()) );
zdPhone.Call();
ZSPhone zsPhone=new ZSPhone(ApplePhone(new ColorMesage()));
ZdPhone.Call();
ZSPhone zdPhone=new ZSPhone(new AndroidPhone(New ShortMessage()) );
zdPhone.Call();
ZSPhone zsPhone=new ZSPhone(ApplePhone(new ShortMessage()));
ZdPhone.Call();
这样就通过构造函数中对父类的层层调用,再重写的的方法中对父类的层层补充,既可以完成功能的扩展,而且还能够不影响原本的功能。
下边,我出一道题,如何在上边的方法中,将电话的功能再补充上玩单机游戏和网络游戏的功能??大家可以根据上边的试一试。