java实现装饰模式,JAVA实现装饰模式

JAVA实现装饰模式

环境:汽车4s店汽车销售,出售奥迪A1,A4,A6。可装饰的组件有倒车雷达,真皮座椅,GPS定位。有一辆裸车,要实现对裸车的装饰

分析:买车的人需求各不一样,有的人要奥迪A1装有雷达、GPS,有的人要奥迪A4装有真皮座椅、GPS等等。如果你把所有的可能情况都例举出来,就会出现“类爆炸”的现象,显然这是不合理的。

问题:动态的给一个对象添加一些功能扩展

解决方案:装饰模式

角色:装饰者

被装饰者

a70893e7142664f5e07ea908a6095eb9.png

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

fa080dc68bf90b7fdb3b363e494d1991.png

项目中,我们经常这样写

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实现装饰模式 图文文章

c3dd9c54c619ab336efbbfd5490a2b55.pngFLV文件格式——图文并茂

FLV文件格式——图文并茂 http://m.blog.csdn.net/u013010310/article/details/52415147 FLV文件格式 FLV包括文件头(File Header)和文件体(File Body)两部分。文件结构如图所示: FLV文件头 header部分记录了flv的类型、版本等信息,是flv的开头,一般都

19bb024185468cb7a4f396e079f3aab5.png2020年建筑电工(建筑特殊工种)证模拟考试题库及建筑电工(建筑特

2020年建筑电工(建筑特殊工种)证模拟考试题库及建筑电工(建筑特殊工种)理论考试试题 题库来源:安全生产模拟考试一点通公众号小程序 2020年建筑电工(建筑特殊工种)证模拟考试题库及建筑电工(建筑特殊工种)理论考试试题是由公众号安全生产模拟考试一点通提供

e3c88e74aedd2adae734cfd5b2f9e23d.png传拼多多融资30亿美元;张一鸣发公开信致歉;美团、滴滴、饿了么

传拼多多融资30亿美元;张一鸣发公开信致歉;美团、滴滴、饿了么被约谈丨价值早报 第【918】期早报由【周四 】赞助播 出 01 今日头条 微信QQ将暂停短视频APP外链直接播放功能 4月11日消息:继快手、火山小视频等APP被下架,内涵段子永远关停之后,据钛媒体了

6826e34d772373d76ad2931115994c8d.gif在北京上不了路的无人驾驶却在杭州实现了商业化

在北京上不了路的无人驾驶,却在杭州实现了商业化 无人驾驶的发展切忌跨大步,一步一步脚踏实地的积累必不可少。 还记得2个月前百度开发者大会之后,李彦宏乘坐一辆无人驾驶测试车行驶在北京五环,但是其乘坐的测试车因为无人驾驶,而且变道压线,不仅被交管

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值