java设计模式?组合模式详解
java设计模式?组合模式详解,恰卡网带你了解更多相关信息。
目录
- 组合模式
- Demo
- 代码:
- 总结
组合模式
组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
- 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
- 如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。
- 何时使用:
1.您想表示对象的部分-整体层次结构(树形结构)。
2.您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
- 使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
优点 | 缺点 |
---|---|
高层模块调用简单,节点自由增加。 | 叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。 |
文件夹-文件的树形结构一定不陌生,文件看作叶子结点(单个对象),文件夹看作中间结点(组合对象)。
组合模式使得用户对单个对象和组合对象的访问具有一致性,即让用户以一致的方式处理个别对象以及组合对象。避免在使用过程中区分开来,造成麻烦。
- Component :组合中的对象声明接口,用于访问和管理Component子部件。
- Leaf:单个/叶子对象,叶子结点没有子结点。
- Composite:组合/容器对象,存储子部件和枝节点行为,实现与子部件有关操作,如增加(add)和删除(remove)等,list实现容器,容纳Component对象。
Demo
先来看看一般的写法:
当用户只满足一种折扣方案时,这种方法还能应对。
但精打细算的我们往往是同时满足多种折扣方案,这时就可以用组合模式,把这些单个折扣方案组合容纳起来,然后定义解决折扣冲突策略。实现单个对象和组合对象的统一,让调用者使用时不必在区分。
把组合对象CompositeDiscount定义成抽象类,SingleMinStrategy和MultipleStrategy继承它,表示解决冲突的策略,分别是取最小折扣和取折上折。
一般解决折扣冲突都是折上折,但商家往往更精明,推出互斥券之类的,即取最小折扣。也可以自定义其他折扣冲突策略。
涉及了点工厂模式和策略模式,DiscountFactory就是实例化Order类的属性DiscountStrategy的工厂,各种折扣策略实现同一接口。
代码:
public interface DiscountStrategy { public double getTotal(double price); } public class VIPDiscount implements DiscountStrategy { //95折 @Override public double getTotal(double price) { return 0.95*price; } } public class ActivityDiscount implements DiscountStrategy{ //9折 @Override public double getTotal(double price) { return 0.9*price; } } public class StoreDiscount implements DiscountStrategy{ //满500超出部分打6折 @Override public double getTotal(double price) { return 500+0.6*(price-500); } }
public abstract class CompositeDiscount implements DiscountStrategy { protected List<DiscountStrategy> strategies =new ArrayList(); //容器 public void add(DiscountStrategy discountStrategy){ //添加叶子结点 strategies.add(discountStrategy); } @Override public double getTotal(double price) { return price; } } //多种折扣选最低折扣 public class SingleMinStrategy extends CompositeDiscount { @Override public double getTotal(double price) { double rtn=price; for (DiscountStrategy s: strategies) { rtn=Math.min(rtn,s.getTotal(price)); } return rtn; } } //多种折扣用折上折 public class MultipleStrategy extends CompositeDiscount { @Override public double getTotal(double price) { double rtn = price; for (DiscountStrategy s : strategies) { rtn = s.getTotal(rtn); } return rtn; } }
public class DiscountFactory { public DiscountStrategy create(String type){ //工厂来创建相应策略 //单一折扣策略 if("ynn".equals(type))return new VIPDiscount(); else if("nyn".equals(type))return new StoreDiscount(); else if("nny".equals(type))return new ActivityDiscount(); else{ //多种折扣策略 CompositeDiscount compositeDiscount; System.out.println("请选择冲突解决方案:1.折上折 2.最低折"); Scanner scanner=new Scanner(System.in); int type2=scanner.nextInt(); if(type2==1){ compositeDiscount=new MultipleStrategy(); } else{ compositeDiscount=new SingleMinStrategy(); } if(type.charAt(1)=='y')compositeDiscount.add(new StoreDiscount()); if(type.charAt(0)=='y')compositeDiscount.add(new VIPDiscount()); if(type.charAt(2)=='y')compositeDiscount.add(new ActivityDiscount()); return compositeDiscount; } } }
public class Order { public double price; private String type; public DiscountStrategy discountStrategy; public Order(double price) { this.price=price; } public void display(){ System.out.println("总价:"+price); System.out.println("是否是VIP?y/n"); Scanner scanner=new Scanner(System.in); type=scanner.next(); System.out.println("是否超过500?y/n"); String tmp; tmp=scanner.next(); type+=tmp; System.out.println("是否满足活动价?y/n"); tmp=scanner.next(); type+=tmp; DiscountFactory discountFactory=new DiscountFactory(); double discountPrice=discountFactory.create(type).getTotal(price); System.out.println("优惠:"+(price-discountPrice)); System.out.println("应付:"+discountPrice); } } public class Client { public static void main(String[] args) { Order order=new Order(620); order.display(); } }
运行结果:
这样一来,无论是单一折扣还是多种折扣,客户端使用时都是一个用法,不必区分和操心。
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注趣讯吧的更多内容!
推荐阅读
-
洗衣机不脱水了是怎么回事(洗衣机不甩干的处理方法)
洗衣机作为大家日常生活必备的家用电器,其利用率频繁,难免会因为机械磨损、缺乏润滑油、机件老化、弹簧疲劳变形等原因,出现各种不正...
-
电子表格零基础自学教程(小白也能学明白)
可能很多人(包括我)觉得Excel不就是做个表吗,没什么好学的。然而很多大型企业在面试的时候还是会问,“会Excel吗?”“会...
-
笔记本电脑报价大全(联想笔记本多少钱)
(注意:建议在旗舰店、官方旗舰店、官网购买) 一、游戏本设计本、办公本推荐如下: 华为品牌:(全球第一大电信设备商) 1...
-
煲机软件哪个好(让耳机有个思想准备)
《无间道》中陈永仁与刘建明有过一句经典对白&mdash;&mdash;“高音甜、中音准、低音沉,总之一个词通透”。这一句话也一...
-
viewsonic平板电脑(viewsonic平板电脑刷机)
ViewSonic是一个视讯品牌,中文名字:优派。 ViewSonic 一、读音:英[vju:][?s?n?k],美[vj...
-
采访麦克风户外哪款好(讯飞智能无线麦克风C1采访神器)
对于视频创作者、直播工作者、远程培训老师、记者等媒体工作者来说,工作过程中,最让人费心的莫过于如何确保收音纯正、字幕快速生成、...
-
电脑硬件配置怎么查(详述两招快速查看电脑配置参数信息)
大家好,今天跟大家分享两个快速查看电脑配置参数信息的办法。 操作步骤如下: 1右击电脑屏幕最下方任务栏左侧的电脑徽标按钮,...
-
数据线没坏但充不上电怎么办(数据线充不上电处理方法)
苹果充电器突然充不上电是比较尴尬的问题,首先看自己的充电器数据线是不是原装,如果非原装在第一次充电时,苹果手机会提示你是否要适...
-
电脑开机出现黑屏如何处理(电脑不能开机黑屏解决方法)
电脑不能开机或者开机以后黑屏怎么解决?这里收集了所有常见的维修方法,看完秒变维修高手,实在是一篇不能错过的电脑维修教程。简单易...
-
手机宝典怎么搞(小米手机性能优化宝典)
别再总是抱怨手机卡顿,系统臃肿,反应慢,现在看完这篇文章,你会发现你并不了解小米手机,当然,文中许多方法并不是仅仅适用于小米手...