文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java中怎么实现组合模式

2023-06-20 17:20

关注

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


组合模式

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

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

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

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

java中怎么实现组合模式

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

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

java中怎么实现组合模式

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中怎么实现组合模式,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯