Python 官方文档:入门教程 => 点击学习
目录组合模式Demo代码:总结组合模式 组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来
组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
1.您想表示对象的部分-整体层次结构(树形结构)。
2.您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
优点 | 缺点 |
---|---|
高层模块调用简单,节点自由增加。 | 叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。 |
文件夹-文件的树形结构一定不陌生,文件看作叶子结点(单个对象),文件夹看作中间结点(组合对象)。
组合模式使得用户对单个对象和组合对象的访问具有一致性,即让用户以一致的方式处理个别对象以及组合对象。避免在使用过程中区分开来,造成麻烦。
先来看看一般的写法:
当用户只满足一种折扣方案时,这种方法还能应对。
但精打细算的我们往往是同时满足多种折扣方案,这时就可以用组合模式,把这些单个折扣方案组合容纳起来,然后定义解决折扣冲突策略。实现单个对象和组合对象的统一,让调用者使用时不必在区分。
把组合对象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();
}
}
运行结果:
这样一来,无论是单一折扣还是多种折扣,客户端使用时都是一个用法,不必区分和操心。
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!
--结束END--
本文标题: java设计模式-组合模式详解
本文链接: https://www.lsjlt.com/news/130772.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0