浅谈装饰者模式的简单使用和思路

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35681180/article/details/53618201

说到装饰者模式很多人都感觉很难理解,到底什么是所谓的装饰?

在这里,我先谈一谈我个人的理解吧。

所谓装饰,那就是在不改变原先状态的情况下,给某个对象或者说某个东西添加一些的额外的属性,来增加其使用,前提一定是不影响原先的结构,给原先的状态增加一些扩展性,从网上也查找了很多关于装饰者模式的使用和介绍,但是,太过于官方了,实在是看不太懂,只能按照自己的理解来写这一篇文章了。

说到这里我先写一个例子:

先描述一下基本的三个基本:

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();

这样就通过构造函数中对父类的层层调用,再重写的的方法中对父类的层层补充,既可以完成功能的扩展,而且还能够不影响原本的功能。


下边,我出一道题,如何在上边的方法中,将电话的功能再补充上玩单机游戏和网络游戏的功能??大家可以根据上边的试一试。









阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页