建设企业网站有哪些,wordpress 图片超链接,沈阳做网站一诚金网络专业,网络平台有哪些转载自 设计模式#xff08;5#xff09;装饰器模式#xff08;讲解应用#xff09;目录
装饰器模式为什么使用装饰器模式应用实例
装饰器模式
看到装饰器是在看《Thinking in Java》一书的时候#xff0c;看到文件读写那边的时候#xff0c;有提到装饰器模式#xff0c…转载自 设计模式5装饰器模式讲解应用目录
装饰器模式为什么使用装饰器模式应用实例
装饰器模式
看到装饰器是在看《Thinking in Java》一书的时候看到文件读写那边的时候有提到装饰器模式同时在文件读写的那一部分对于各种读入写出的方式代码组织结构感觉也是比较怪的怪的总是吸引人的。
装饰器模式:在不必改变原类文件和使用继承的情况下动态地扩展一个对象的功能。它是通过创建一个包装对象也就是装饰来包裹真实的对象。通过使用装饰器模式我们可以实现关闭原有代码开放现有代码的方式来实现更多的功能。通过减少对原有代码的改变来降低犯错误的几率。不改变妹子的三围通过装饰不同的制服实现一个动态扩展我们就会看到教师护士其本质功能还是未改变的只是体验更上一层楼。。。
为什么使用装饰器模式
继续上面的需求来举例子吧现在我们要针对该服务场所制定一个订单系统当客户来选择的时候点一项服务我们需要向订单中加入一项然后最后计算一个总和由于young woman,student,nurse等基础价格是不同的假设在其基础之上的单项服务价格是相同的首先我们想到的可能是根据不同的类型继承自一个基类建立一个类然后每个作为一个实例将各项服务作为一个全局变量然后各项服务有一个set方法用来改变这些服务的状态两次调用可以取消该服务默认各项服务的状态是关闭的然后最后通过一个cost方法判断各种服务的来计算总价格当然感觉这是一个很不错的方法。但是由于某种服务的特殊性原因能提供该服务的人减少所以该服务价格上涨或者是在某种服务在一个不小心中诞生因此我们需要打开源代码进行添加一些服务然后需要添加set方法同时我们需要对cost进行修改随着人民思路不断开阔冒险精神日益增强各种服务如雨后春笋我们的维护工作将变得比工作人员还要辛苦了。这个时候就要引出我们的装饰器模式我们将所有需要付费的拿出来因为我们在后期的维护上就是价格导致的变化给我们带来了困扰所以如果将这些变化的价格拿出来单独维护我们的工作量将会减少。如下结构
//基础抽象类
public abstract class SexService{String description Best Service;public String getDescription(){return description;}public abstract int cost();
}
//继承自抽象类的本体
public class Nurse extends SexService{public Nurse(){description You konw;}public int cost(){return 150;}
}
//继承自基础类的用来修饰本体的类
public class PlayXiao extends SexService{SexService service;public PlayXiao(SexService service){this.service service;}public String getDescription(){return service.getDescriptionPlayXiao;}public int cost(){return service.cost50;}}
调用方式
Nurse sweetHeart new Nurse();
sweetHeart new PlayXiao(sweetHeart);
首先我们创建一个本体类然后将其作为一个实例通过构造函数注入到一个装饰类在装饰类内部通过委托的形式获得当前的价格和描述同时由于本体类和装饰类继承自同一个基类所以可以用来继续向下传递。基础抽象类通过构造函数进行实例注入通过委托实现状态数据更新从而实现关闭原有代码开放现有代码。
应用实例
言归正传回到正题上来讲一下其在我们平常开发中的例子开始也提到了一点关于Javaio库的问题java I/O库具有两个对称性它们分别是
输入-输出对称比如InputStream 和OutputStream 各自占据Byte流的输入和输出的两个平行的等级结构的根部而Reader和Writer各自占据Char流的输入和输出的两个平行的等级结构的根部。byte-char对称InputStream和Reader的子类分别负责byte和Char流的输入OutputStream和Writer的子类分别负责byte和Char流的输出
这些作为根类如果我们想通过缓冲字节或者是管道这个时候我们就需要使用装饰器来进行装饰然后通过装饰器来实现相应的操作根类具有read方法对于装饰类通过构造函数将基类的一个实例注入进去然后通过委托模式首先通过基类的read方法获取字节流然后根据相应的操作实现字节读取等。InputStreamReader input new InputStreamReader(System.in);
BufferedReader reader new BufferedReader(input);
String line reader.readLine();