温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java中怎么实现组合模式

发布时间:2021-07-20 10:41:26 来源:亿速云 阅读:188 作者:Leah 栏目:开发技术

本篇文章给大家分享的是有关java中怎么实现组合模式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。


组合模式

组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

  • 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

  • 如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

  • 何时使用:

1.您想表示对象的部分-整体层次结构(树形结构)。

2.您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

  • 使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

优点缺点
高层模块调用简单,节点自由增加。叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

java中怎么实现组合模式

文件夹-文件的树形结构一定不陌生,文件看作叶子结点(单个对象),文件夹看作中间结点(组合对象)。

组合模式使得用户对单个对象和组合对象的访问具有一致性,即让用户以一致的方式处理个别对象以及组合对象。避免在使用过程中区分开来,造成麻烦。

java中怎么实现组合模式

  • Component :组合中的对象声明接口,用于访问和管理Component子部件。

  • Leaf:单个/叶子对象,叶子结点没有子结点。

  • Composite:组合/容器对象,存储子部件和枝节点行为,实现与子部件有关操作,如增加(add)和删除(remove)等,list实现容器,容纳Component对象。

Demo

先来看看一般的写法:

java中怎么实现组合模式

当用户只满足一种折扣方案时,这种方法还能应对。

但精打细算的我们往往是同时满足多种折扣方案,这时就可以用组合模式,把这些单个折扣方案组合容纳起来,然后定义解决折扣冲突策略。实现单个对象和组合对象的统一,让调用者使用时不必在区分。

java中怎么实现组合模式

把组合对象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();     } }

运行结果:

java中怎么实现组合模式

java中怎么实现组合模式

以上就是java中怎么实现组合模式,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI