设计一个网上书店,该系统中所有的计算机类图书(ComputerBook)每本都有10%的折扣,所有的语言类图书(LanguageBook)每本都有2元的折扣,小说类图书(NovelBook)每100元

现使用策略模式来设计该系统,绘制类图并编程实现

UML类图
在这里插入图片描述
书籍

package com.zheng;

public class Book {
	private double price;// 价格
	private Discount discount;// 维持一个对抽象折扣类的引用

	// 调用折扣类的折扣计算方法
	public double getPrice() {
		return discount.calculate(this.price);
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public void setDiscout(Discount discount) {
		this.discount = discount;
	}

}

调用不同价格的接口

package com.zheng;

public interface Discount {

	public double calculate(double price);//计算价格

}

具体实现折扣

package com.zheng;

public class ComputerBook implements Discount {
	
	private final double DISCOUNT=0.9;//购买计算机类书籍90%的折扣

	@Override
	public double calculate(double price) {
		System.out.println("计算机类书籍");
		return price*DISCOUNT;
	}

}

package com.zheng;

public class LanguageBook implements Discount {
	private final double DISCOUNT=2;

	@Override
	public double calculate(double price) {
		System.out.println("语言类书籍");
		return price-DISCOUNT;
	}

}

package com.zheng;

public class NovelBook implements Discount {
	private final double DISCOUNT=10;

	@Override
	public double calculate(double price) {
		System.out.println("小说");
		if(price>=100) {
			return price-DISCOUNT;
		}
		else
			return price;
		
	}

}

测试端

package com.zheng;


public class Client {

	public static void main(String[] args) {
		Discount discount,discount1,discount2;
		Book book=new Book();
		double originalPrice=100;//原价
	
		book.setPrice(originalPrice);
		System.out.println("原价为:"+originalPrice+"元");
		System.out.println("------------------------------");
		
		discount=new ComputerBook();
		book.setDiscout(discount);
		System.out.println("折扣后的价格:"+book.getPrice());
		System.out.println("------------------------------");
		discount1=new LanguageBook();
		book.setDiscout(discount1);
		System.out.println("折扣后的价格:"+book.getPrice());
		System.out.println("------------------------------");
		discount2=new NovelBook();
		book.setDiscout(discount2);
		System.out.println("折扣后的价格:"+book.getPrice());
	}

}

测试截图
在这里插入图片描述

策略模式优缺点

优点:1、符合开闭原则。2、避免重复的代码。3、可以避免多重条件选择语句。4、提供了一种算法的复用机制,不同的环境类可以方便的复用这些策略类。

缺点:1、无法同时在客户端使用多个策略类。2、将造成系统产生很多具体的策略类。3、客户端必须知道所有的策略类,自行决定使用哪一个策略类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Aholic

整理不易、多谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值