您现在的位置是:首页 > 数码 > 

设计模式——(装饰者模式)(组合模式)

2025-07-18 15:43:50
设计模式——(装饰者模式)(组合模式) 装饰者模式 介绍 动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)。 实例: 有个咖啡店里面有各种咖啡和调料,让他们组合会非常麻烦,这时候出现了装饰者模式,咖啡作为主体,

设计模式——(装饰者模式)(组合模式)

装饰者模式

介绍

动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)。

实例:

有个咖啡店里面有各种咖啡和调料,让他们组合会非常麻烦,这时候出现了装饰者模式,咖啡作为主体,调料作为包装。

步骤:

1.先写Drink主类,里面写入描述和价格的参数,并get/set,并写入一个抽象方法cost(),谁继承谁实现

public abstract class Drink {public String des;private float price=0.0f;public String getDes() {return des;}public void setDes(String des) {this.des = des;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public abstract float cost();
}

2.创建咖啡类继承Drink

public class Coffee extends Drink{@Overridepublic float cost() {return super.getPrice();}
}

.创建详细咖啡类并通过set设置名称和价格

public class Espresso extends Coffee{public Espresso() {setDes(Espresso );setPrice(6.0f);}
}
----------------------------------------
public class LongBlack extends Coffee{public LongBlack() {setDes(Long Black);setPrice(5.0f);}
}
-----------------------------------------
public class ShortBlack extends Coffee{public ShortBlack() {setDes(shotr black);setPrice(4.0f);}
}

4.创建一个装饰者,并通过组合的方式获得咖啡

public class Decorator extends Drink{private Drink obj;public Decorator(Drink obj) {=obj;}@Overridepublic float cost() {return super.getPrice()();}@Overridepublic String getDes() {return super.des super.getPrice()&&obj.getDes();}
}

5.创建调料类

public class Chocolate extends Decorator{public Chocolate(Drink obj) {super(obj);setDes(Chocolate);setPrice(.0f);}
}
-----------------------------------------
public class Milk extends Decorator{public Milk(Drink obj) {super(obj);setDes(Milk);setPrice(2.0f);}}

6.创建咖啡店

public class CoffeeStore {public static void main(String[] args) {//先点一份咖啡Drink longBlack = new LongBlack();println(fe yong=());println(mian shu=longBlack.getDes());//加调料longBlack=new Milk(longBlack);println(fe yong=());println(mian shu=longBlack.getDes());longBlack=new Chocolate(longBlack);println(fe yong=());println(mian shu=longBlack.getDes());longBlack=new Chocolate(longBlack);println(fe yong=());println(mian shu=longBlack.getDes());}
}

组合模式

实例:院校展示,学校——院系——专业

传统方案的问题:专业继承院系,院系继承学校。这是从大小组织上看的,但实际他们不存在这种关系。

介绍:

  • 又叫部分整体模式,创建对象的树形结构。
  • 组合模式用来表示整体层次
  • 属于结构型模式
  • 组合模式使得用户对单个对象和组合对象的访问具有一致性

代码:

先创建一个组织类,用来对学校,院系,专业的描述,让他们分别继承这个组织类

package com.kunposite;public abstract class OrganizationComponet {private String name;private String des;protected void add(OrganizationComponet organizationComponet) {//默认实现throw new UnsupportedOperationException();}protected void remove(OrganizationComponet organizationComponet) {//默认实现throw new UnsupportedOperationException();}public OrganizationComponet(String name, String des) {super(); = name;this.des = des;}public String getame() {return name;}public void setame(String name) { = name;}public String getDes() {return des;}public void setDes(String des) {this.des = des;}public abstract void print();
}

创建学校类,继承刚才的组织类,创建一个数组用来存放院系,重写add,remove方法

package com.kunposite;import java.util.ArrayList;
import java.util.List;public class University extends OrganizationComponet{List<OrganizationComponet> organizationComponets=new ArrayList<>();public University(String name, String des) {super(name, des);// TODO Auto-generated ctructor stub}@Overrideprotected void add(OrganizationComponet organizationComponet) {// TODO Auto-generated method stuborganizationComponets.add(organizationComponet);}@Overrideprotected void remove(OrganizationComponet organizationComponet) {// TODO Auto-generated method stuborganizationComponets.remove(organizationComponet);}@Overridepublic String getame() {// TODO Auto-generated method stubreturn super.getame();}@Overridepublic String getDes() {// TODO Auto-generated method stubreturn super.getDes();}@Overridepublic void print() {// TODO Auto-generated method stubprintln(==========getame()========);for (OrganizationComponet organizationComponet : organizationComponets) {organizationComponet.print();}}}

创建一个院系类,创建一个数组用来存放专业类

package com.kunposite;import java.util.ArrayList;
import java.util.List;public class College extends OrganizationComponet{List<OrganizationComponet> organizationComponets=new ArrayList<>();public College(String name, String des) {super(name, des);// TODO Auto-generated ctructor stub}@Overrideprotected void add(OrganizationComponet organizationComponet) {// TODO Auto-generated method stuborganizationComponets.add(organizationComponet);}@Overrideprotected void remove(OrganizationComponet organizationComponet) {// TODO Auto-generated method stuborganizationComponets.remove(organizationComponet);}@Overridepublic String getame() {// TODO Auto-generated method stubreturn super.getame();}@Overridepublic String getDes() {// TODO Auto-generated method stubreturn super.getDes();}@Overridepublic void print() {// TODO Auto-generated method stubprintln(==========getame()========);for (OrganizationComponet organizationComponet : organizationComponets) {organizationComponet.print();}}}

创建专业类,因为他是叶子节点,所以不用创建数组存放。

package com.kunposite;public class Department extends OrganizationComponet{public Department(String name, String des) {super(name, des);// TODO Auto-generated ctructor stub}@Overridepublic String getame() {// TODO Auto-generated method stubreturn super.getame();}@Overridepublic String getDes() {// TODO Auto-generated method stubreturn super.getDes();}@Overridepublic void print() {// TODO Auto-generated method stubprintln(getame());}}

创建Client主类方法测试

package com.kunposite;public class Client {public static void main(String[] args) {OrganizationComponet university = new University(AAA, 1111);OrganizationComponet college = new College(ji suan ji, ji suan ji);OrganizationComponet college2 = new College(guan li, guan li);college.add(new Department(ji ying, ji ying));college.add(new Department(ji wang, ji wang));college.add(new Department(ji suan, ji suan));college2.add(new Department(jiu dian, jiu dian));university.add(college);university.add(college2);university.print();}
}

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/805347.html

相关标签:无
上传时间: 2024-01-17 22:32:41
留言与评论(共有 8 条评论)
本站网友 聊城房地产信息网
3分钟前 发表
organizationComponets) {organizationComponet.print();}}} 创建专业类,因为他是叶子节点,所以不用创建数组存放
本站网友 大补阴丸
12分钟前 发表
des);// TODO Auto-generated ctructor stub}@Overridepublic String getame() {// TODO Auto-generated method stubreturn super.getame();}@Overridepublic String getDes() {// TODO Auto-generated method stubreturn super.getDes();}@Overridepublic void print() {// TODO Auto-generated method stubprintln(getame());}} 创建Client主类方法测试 package com.kunposite;public class Client {public static void main(String[] args) {OrganizationComponet university = new University(AAA
本站网友 何嘉
6分钟前 发表
组合模式用来表示整体层次属于结构型模式组合模式使得用户对单个对象和组合对象的访问具有一致性 代码: 先创建一个组织类,用来对学校,院系,专业的描述,让他们分别继承这个组织类 package com.kunposite;public abstract class OrganizationComponet {private String name;private String des;protected void add(OrganizationComponet organizationComponet) {//默认实现throw new UnsupportedOperationException();}protected void remove(OrganizationComponet organizationComponet) {//默认实现throw new UnsupportedOperationException();}public OrganizationComponet(String name
本站网友 忆帝京
26分钟前 发表
介绍: 又叫部分整体模式,创建对象的树形结构
本站网友 宋如华
8分钟前 发表
1111);OrganizationComponet college = new College(ji suan ji
本站网友 西安电力高等专科学校
28分钟前 发表
1111);OrganizationComponet college = new College(ji suan ji
本站网友 新桥租房
14分钟前 发表
des);// TODO Auto-generated ctructor stub}@Overrideprotected void add(OrganizationComponet organizationComponet) {// TODO Auto-generated method stuborganizationComponets.add(organizationComponet);}@Overrideprotected void remove(OrganizationComponet organizationComponet) {// TODO Auto-generated method stuborganizationComponets.remove(organizationComponet);}@Overridepublic String getame() {// TODO Auto-generated method stubreturn super.getame();}@Overridepublic String getDes() {// TODO Auto-generated method stubreturn super.getDes();}@Overridepublic void print() {// TODO Auto-generated method stubprintln(==========getame()========);for (OrganizationComponet organizationComponet