JAVA实现装饰模式
环境:汽车4s店汽车销售,出售奥迪A1,A4,A6。可装饰的组件有倒车雷达,真皮座椅,GPS定位。有一辆裸车,要实现对裸车的装饰
分析:买车的人需求各不一样,有的人要奥迪A1装有雷达、GPS,有的人要奥迪A4装有真皮座椅、GPS等等。如果你把所有的可能情况都例举出来,就会出现“类爆炸”的现象,显然这是不合理的。
问题:动态的给一个对象添加一些功能扩展
解决方案:装饰模式
角色:装饰者
被装饰者
Car.java
public abstract class Car {
protected int cost;
protected String description;
public abstract String getDescription();
public abstract int getCost();
}
A1Car.java
public class A1Car extends Car{
public A1Car()
{
cost = 100000;
description = "Audi A1 Car";
}
@Override
public int getCost() {
return cost;
}
@Override
public String getDescription() {
return description;
}
}
A4Car.java
public class A4Car extends Car{
public A4Car()
{
cost = 120000;
description = "Audi A4 Car";
}
@Override
public int getCost() {
return cost;
}
@Override
public String getDescription() {
return description;
}
}
Decorator.java
public class Decorator extends Car{
protected Car c;
protected int decoratorcost;
protected String decoratordescription;
public void setCar(Car a){
c = a;
}
@Override
public int getCost() {
return decoratorcost+c.getCost();
}
@Override
public String getDescription() {
return decoratordescription+c.getDescription();
}
}
GPS.java
public class Gps extends Decorator{
public Gps(){
decoratorcost=500;
decoratordescription="with GPS";
}
}
Radar.java
public class Radar extends Decorator{
public Radar(){
decoratorcost=1500;
decoratordescription="with Radar";
}
}
Test.java
public class Test {
public static void main(String[] args) {
//给奥迪A1装配GPS
Car a1 = new A1Car();
Decorator decorator = new Gps();
decorator.setCar(a1);
System.out.println(a1.getDescription()+"的价格是"+a1.getCost());
System.out.println(decorator.getDescription()+"的价格是"+decorator.getCost());
//想再给A1装配Radar,由于装饰者与被装饰者具有相同的类型,我们可以用装饰后的对象代替原来的对象
Decorator decorator2 = new Radar();
decorator2.setCar(decorator);
System.out.println(decorator2.getDescription()+"的价格是"+decorator2.getCost());
}
}
运行结果
Audi A1 Car的价格是100000
with GPS Audi A1 Car的价格是100500
with Radar with GPS Audi A1 Car的价格是102000
在Java I/O库中输入输出流的设计模式就使用了装饰模式
如Reader
项目中,我们经常这样写
FileReader fr = new FileReader("d:\\myDoc\\test.txt");
BufferedReader br = new BufferedReader(fr);//这里接收一个Reader类型参数
BufferedReader相当于装饰者,而Reader及其子类都可以作为被装饰者
JAVA实现装饰模式 相关文章
css怎么实现图片半透明效果
css实现图片半透明效果的方法:可以通过opacity属性来进行设置,如【style=-moz-opacity:0.5;】。opacity属性用来设置元素的不透明级别,语法为【opacity:value|inherit;】。 本文环境: windows10、css3 适用于所有品牌的电脑 属性介绍: opacity 属性设置
详解使用 JavaScript 解析 URL的方法
在 Web 开发中,有许多情况需要解析 URL, 这篇主要学习如何使用 URL 对象实现这一点。 开始 创建一个以下内容的 HTML 文件,并在浏览器中打开。 html head titleJavaScript URL parsing/title /head body script // 激动人心的代码即将写在这里 /script /bo
了解javascript中3种for循环风格以及何时使用它们
在学习任何开发语言时候,for循环是必不可少的一种语法,可能所有开发人员都会使用它。它非常经典,以至于每个开发语言都至少包括一种关于循环的语法版本。不过,在JavaScript种包含了三种不同的循环语法(如果再讲究一点,也可以算作是四种)。 它们的使用
理解js原型链,继承和promis
javascript栏目介绍原型链,继承和promis。 相关免费学习推荐:javascript(视频) 一、原型链 开局一张图 prototype 每个函数都有一个prototype属性,被称为显示原型 2. _ proto _ 每个实例对象都会有_ proto _属性,其被称为隐式原型 每一个实例对象的隐式
实现springmvc结合ajax批量新增的方法
ajax视频教程 栏目主要介绍了springmvc结合ajax批量新增的实现方法 推荐(免费): ajax视频教程 1.需要注意的问题 mvc框架的处理日期问题 @ResponseBody响应对象是自定义对象,响应不是json @ResopnseBody响应自定义对象时,日期为是long类型的数 结束数据
网站开发语言java和php的区别是什么
网站开发语言java和php的区别是什么?java和php哪个难学?PHP学习是选择自学还是培训?这是很多想从事电脑行业的学员都会问到这个问题。下面本篇文章给大家介绍一下,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 推荐:《PHP实战培训
vue.js怎么实现页面传值
vue.js实现页面传值的方法:1、使用query传值,代码为【var name=this.$route.query.name】;2、使用params传值,代码为【params: { usersitelist: userlist }】。 该方法适用于所有品牌电脑 vue.js实现页面传值的方法: 1、使用query传值【地址栏可见】 比
jquery如何实现一键全选
jquery实现一键全选的方法:首先设置选项框;然后引入jQuery,并且给按钮绑定一个jQuery类型的点击事件;最后通过prop来设置input的属性即可设置全
macos系统下怎么配置java环境变量
具体配置步骤如下: 1、编辑 bash_profile vim ~/.bash_profile输入以下内容并保存export JAVA_HOME=`/usr/libexec/java_home`export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin 2、使环境变量生效 source
java下载网络文件的方法有哪些
下载网络文件的方法有: 字节流下载 apache的FileUtils工具包下载 NIO下载 学习视频分享:java教学视频 实现代码如下: package com.dsp.rpc.metricelf; import org.apache.commons.io.FileUtils; import java.io.File;import java.net.HttpURLConnection;im
JAVA实现装饰模式 图文文章
FLV文件格式——图文并茂
FLV文件格式——图文并茂 http://m.blog.csdn.net/u013010310/article/details/52415147 FLV文件格式 FLV包括文件头(File Header)和文件体(File Body)两部分。文件结构如图所示: FLV文件头 header部分记录了flv的类型、版本等信息,是flv的开头,一般都
2020年建筑电工(建筑特殊工种)证模拟考试题库及建筑电工(建筑特
2020年建筑电工(建筑特殊工种)证模拟考试题库及建筑电工(建筑特殊工种)理论考试试题 题库来源:安全生产模拟考试一点通公众号小程序 2020年建筑电工(建筑特殊工种)证模拟考试题库及建筑电工(建筑特殊工种)理论考试试题是由公众号安全生产模拟考试一点通提供
传拼多多融资30亿美元;张一鸣发公开信致歉;美团、滴滴、饿了么
传拼多多融资30亿美元;张一鸣发公开信致歉;美团、滴滴、饿了么被约谈丨价值早报 第【918】期早报由【周四 】赞助播 出 01 今日头条 微信QQ将暂停短视频APP外链直接播放功能 4月11日消息:继快手、火山小视频等APP被下架,内涵段子永远关停之后,据钛媒体了
在北京上不了路的无人驾驶却在杭州实现了商业化
在北京上不了路的无人驾驶,却在杭州实现了商业化 无人驾驶的发展切忌跨大步,一步一步脚踏实地的积累必不可少。 还记得2个月前百度开发者大会之后,李彦宏乘坐一辆无人驾驶测试车行驶在北京五环,但是其乘坐的测试车因为无人驾驶,而且变道压线,不仅被交管