java模式之装饰模式
1. 什么叫装饰模式?
根据业务的需求,需要对一个类的方法进行增强的处理。
2. 为什么需要装饰模式?
拓展性更加的好,当觉得这个装饰不好的时候,可以直接拿下,不需要改变任何的代码。
3. 装饰模式的一个具体的应用? 电子发票系统
代码:
package com.huxin.decorator.test;
import java.util.Date;
import java.util.Vector; abstract public class Order {
private String name;
private Date date ;
private Vector itemsLinelist = new Vector(10);
public Order(){
System.out.println("调用order的构造方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public double getTotalPrice() {
double price = 0.0d;
for(int i =0 ;i<itemsLinelist.size();i++){
ItemsLine itemsLine = (ItemsLine)itemsLinelist.get(i);
price +=itemsLine.getSubTotalPrice();
}
return price;
}
public void addItems(ItemsLine itemsLine){
itemsLinelist.add(itemsLine);
} public void removeItems(ItemsLine itemsLine){
itemsLinelist.remove(itemsLine);
}
public void print(){
System.out.println("order==================================================");
for(int i =0 ;i<itemsLinelist.size();i++){
ItemsLine itemsLine = (ItemsLine)itemsLinelist.get(i);
itemsLine.print();
}
}
}
package com.huxin.decorator.test; public class SalsOrder extends Order {
public SalsOrder(){
System.out.println("调用SalsOrder的构造方法");
}
public void print(){
super.print();
}
}
package com.huxin.decorator.test; public class ItemsLine {
private String itemsName;
private double unit ;
private int number;
private double subTotalPrice;
public String getItemsName() {
return itemsName;
}
public void setItemsName(String itemsName) {
this.itemsName = itemsName;
} public double getUnit() {
return unit;
}
public void setUnit(double unit) {
this.unit = unit;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public double getSubTotalPrice() {
return number * unit;
}
public void print(){
System.out.println("购买商品的名字为:"+ itemsName+ "单价为:"+ unit+ "数量为"+ number);
}
}
package com.huxin.decorator.test; abstract public class AbstractDecorator extends Order{
protected Order order;
//装饰类必须接受这个order对象
public AbstractDecorator(Order order){
this.order = order;
this.setDate(order.getDate());
this.setName(order.getName());
}
public void print(){
super.print();
}
}
package com.huxin.decorator.test; public class FootDecorator extends AbstractDecorator {
//装饰类必须接受这个order对象
public FootDecorator(Order order){
super(order);
System.out.println("我后被创建FootDecorator");
}
public void print(){
order.print();
printFooter();
}
public void printFooter(){
System.out.println("foot==================================================");
System.out.println("总价格为:"+ super.order.getTotalPrice());
}
}
package com.huxin.decorator.test; public class HeaderDecorator extends AbstractDecorator {
//装饰类必须接受这个order对象
public HeaderDecorator(Order order){
super(order);
System.out.println("我先被创建HeaderDecorator");
}
public void print(){
printHeader();
super.order.print();
}
public void printHeader(){
System.out.println("header==================================================");
System.out.println("顾客的姓名为:"+ super.order.getName() +"日期为:"+ super.order.getDate());
}
}
package com.huxin.decorator.test; import java.util.Date; public class Client {
private static Order order;
public static void main(String[] args) { order = new SalsOrder(); ItemsLine itemsLine = new ItemsLine();
itemsLine.setItemsName("杯子");
itemsLine.setUnit(8.0d);
itemsLine.setNumber(1); ItemsLine itemsLine2 = new ItemsLine();
itemsLine2.setItemsName("疯狂java");
itemsLine2.setUnit(610d);
itemsLine2.setNumber(2); order.addItems(itemsLine2);
order.addItems(itemsLine); order.setDate(new Date());
order.setName("胡鑫");
order= new HeaderDecorator(new FootDecorator(order));
order.print();
}
}
java模式之装饰模式的更多相关文章
- 代理模式 vs 装饰模式
代理模式和装饰模式有很大的相似性,二者的类图(几乎)是一样的.下面分别讲解代理模式和装饰模式. 1.代理模式 一般著名的跑步运动员都会有自己的代理人,如果想联系该运动员的比赛事宜,可以直接联系他的代理 ...
- JAVA设计模式:装饰模式
前面我们学习了代理模式: 代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你 ...
- 设计模式GOF23(结构型模式:代理模式,适配模式,桥接模式,组合模式,装饰模式,外观模式,享元模式)
结构型模式: – 分类: • 适配器模式.代理模式.桥接模式.装饰模式.组合模式.外观模式.享元模式 – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 结构 ...
- Java模式之模板方法模式
当我们遇到的业务逻辑具有大致相同的方式的时候,我们也许就该将这个业务逻辑抽象出来,采用模板方法,来进行封装我们的代码,提高代码的重用性,以及可维护性.下面是我的一个复习用的案例: 第一步:我们需要一个 ...
- 设计模式:代理模式 vs 装饰模式
参考文章:https://www.cnblogs.com/luoxn28/p/5535877.html 代理模式和装饰模式非常类似,甚至代码都类似. 二者最主要的区别是: 代理模式中,代理类对被代理的 ...
- 【设计模式】 模式PK:代理模式VS装饰模式
1.概述 对于两个模式,首先要说的是,装饰模式就是代理模式的一个特殊应用,两者的共同点是都具有相同的接口,不同点则是代理模式着重对代理过程的控制,而装饰模式则是对类的功能进行加强或减弱,它着重类的功能 ...
- Java模式开发之责任链模式
Java模式开发之责任链模式 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓.击鼓的地方与传花的地方是分开的.以示公正. 開始击鼓时,花束就開始依次传递,鼓 ...
- Java设计模式(9)——结构型模式之装饰模式(Decorator)
一.概述 动态地给一个对象添加一些额外的职责.就增加功能来说, Decorator模式相比生成子类更为灵活.该模式以对客 户端透明的方式扩展对象的功能. UML简图 角色 在持有Component的引 ...
- javascript模式 (3)——工厂模式和装饰模式
上节我们讲解了单例模式,这节我们将继续讲解工厂模式和迭代器模式 工厂模式: 工厂模式的目的是为了方便的创建对象(可以在不知道构造的情况下),通过静态方法来实现,在java或c#等静态编译语言中需要通过 ...
随机推荐
- Android小应用-----画画板
public class MainActivity extends Activity { private ImageView iv; float startX = 0; float startY = ...
- 为Pythonic论坛添加一个“专题”功能
代码还没读完就踏上了修改功能的深坑.还好思路清晰,通过修改模板和视图,实现了专题模块 原论坛的模式是用户点击节点发帖,然后就归到节点的分类里面了.我需要一个功能,就是右侧需要一个专题区,管理员发帖的话 ...
- 分享UI设计模型
UI设计模型是可重用的界面设计解决方案,可以让开发人员少走弯路,节约不少开发时间.下面慧都小编跟大家分享6个很有用的UI设计模型资源,希望对你有用: 1.UI Patterns 由一个丹麦人开发的UI ...
- viewstate cookie和session原理回顾
--个人理解会存在些错误仅供参考!!! ----浏览器保持会话状态原理 用户发送一次请求,服务器端会检索报文中是否存在sessionid不存在,就分配一个写到cookie当中,存在浏览器的缓存中,当再 ...
- AngularJS Change Path Without Reloading
To change path URL with AngularJS, $location.path() is passed the new URL as a parameter, and the pa ...
- 数据结构栈的java实现
近来复习数据结构,自己动手实现了栈.栈是一种限制插入和删除只能在一个位置上的表.最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表. 实现方式是这样的:首先定义了一个接口,然后通过这个接口实现了线 ...
- Apache指南:CGI动态页面
概要 相关模块 相关指令 mod_alias mod_cgi AddHandler Options ScriptAlias CGI(公共网关接口[Common Gateway Interface])定 ...
- Definition of:payload
(1) Refers to the "actual data" in a packet or file minus all headers attached for transpo ...
- nhibernate+autofac+mvc的demo
想自己做一个小的demo.目的是能够提供一个系统架构,在这个基础上,可以快速开发一些小型的系统.
- Asp.net MVC4 CodeFirst 使用EFTracingProvider
一.关于EFTracingProvider EFTracingProvider相关信息见作者博客:关于EFTracingProvider EFTracingProvider Demo下载地址:Trac ...