iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java中怎么实现组合模式
  • 232
分享到

java中怎么实现组合模式

2023-06-20 17:06:37 232人浏览 安东尼
摘要

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

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


组合模式

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

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

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

  • 何时使用:

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

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

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

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

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

--结束END--

本文标题: java中怎么实现组合模式

本文链接: https://www.lsjlt.com/news/298447.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作