浅谈装饰者模式的简单使用和思路
2016-12-13 23:31
302 查看
说到装饰者模式很多人都感觉很难理解,到底什么是所谓的装饰?
在这里,我先谈一谈我个人的理解吧。
所谓装饰,那就是在不改变原先状态的情况下,给某个对象或者说某个东西添加一些的额外的属性,来增加其使用,前提一定是不影响原先的结构,给原先的状态增加一些扩展性,从网上也查找了很多关于装饰者模式的使用和介绍,但是,太过于官方了,实在是看不太懂,只能按照自己的理解来写这一篇文章了。
说到这里我先写一个例子:
先描述一下基本的三个基本:
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();
这样就通过构造函数中对父类的层层调用,再重写的的方法中对父类的层层补充,既可以完成功能的扩展,而且还能够不影响原本的功能。
下边,我出一道题,如何在上边的方法中,将电话的功能再补充上玩单机游戏和网络游戏的功能??大家可以根据上边的试一试。
在这里,我先谈一谈我个人的理解吧。
所谓装饰,那就是在不改变原先状态的情况下,给某个对象或者说某个东西添加一些的额外的属性,来增加其使用,前提一定是不影响原先的结构,给原先的状态增加一些扩展性,从网上也查找了很多关于装饰者模式的使用和介绍,但是,太过于官方了,实在是看不太懂,只能按照自己的理解来写这一篇文章了。
说到这里我先写一个例子:
先描述一下基本的三个基本:
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();
这样就通过构造函数中对父类的层层调用,再重写的的方法中对父类的层层补充,既可以完成功能的扩展,而且还能够不影响原本的功能。
下边,我出一道题,如何在上边的方法中,将电话的功能再补充上玩单机游戏和网络游戏的功能??大家可以根据上边的试一试。
相关文章推荐
- 使用模式的一个简单例子——画图程序
- 装饰者模式---使用装饰者模式实现带日志记录功能的数据库命令执行类
- C# 一个简单分词程序的思路和代码(五) 使用代码
- winform使用模式窗体,简单操作控件
- Groovy探索之MOP 十六 使用Interceptor实现简单的观察家模式
- 浅谈.net 中的职责链模式的使用
- 使用简单工厂模式出现程序集不能加载的问题的解决方案
- 设计模式(1)-使用简单工厂优化代码(转载)
- 有趣的Java - 简单使用enum实现策略模式Strategy
- 使用命令模式实现简单的支持撤销的计算器
- 抽象工厂模式:简单工厂模式、工厂方法模式对比;在工厂方法模式中使用反射创建对象实例
- 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
- 【浅谈设计模式】1 简单工厂模式
- 抽象工厂模式第二步-使用简单工厂模式
- 浅谈观察者、工厂、简单工厂设计模式
- 设计模式之三:装饰者模式(简单实现(星巴兹咖啡))
- 解析XML,将数据显示在treeview上,使用简单工厂模式
- 浅谈开发工作中使用的敏捷开发模式
- 浅谈开发工作中使用的敏捷开发模式
- 浅谈开发工作中使用的敏捷开发模式