目录
一 运行效果图展示
-
系统初始界面
-
模拟用户是普通顾客
-
模拟用户是vip顾客
-
模拟用户是svip顾客
-
模拟同时购买多种水果
二 需求分析
运用单例模式实现每一个客户打开界面时首先显示“欢迎光临”,用来模拟客户来到水果店,服务员的行为。
水果店销售四种水果:苹果、香蕉、橘子、芒果。单个水果的价格分别是4元、2元、3元、5元。运用简单工厂模式可以很好的解决这一问题。
水果店对于不同的顾客结账时,会有不同的优惠方案, 普通用户支付原价,vip用户打7折,svip用户打6折,优惠不可同时叠加使用。优惠方案未来可能会有变动,运用策略模式可以很好的解决这一问题。
三 设计模式及类图
根据需求分析描述水果店打折系统可以采用三种设计模式:
打开界面后显示“欢迎光临”采用了单例模式,一个客户只能实例化一种;水果店生产苹果、香蕉、橘子、芒果采用了简单工厂模式;结账时根据不同类型的客户优惠方式不同采用了策略模式。
- 模式定义
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
- 模式结构
创建一个 SingleObject 类。SingleObject 类有它的私有构造函数和本身的一个静态实例。SingleObject 类提供了一个静态方法,供外界获取它的静态实例。SingletonPatternDemo 类使用 SingleObject 类来获取 SingleObject 对象。
类图如图3所示
2 简单工厂模式及其实现类
- 模式定义
创建一个 SingleObject 类。SingleObject 类有它的私有构造函数和本身的一个静态实例。
SingleObject 类提供了一个静态方法,供外界获取它的静态实例。SingletonPatternDemo 类使用 SingleObject 类来获取 SingleObject 对象。
- 模式结构
水果工厂:Fruit_factory
抽象水果:Fruit
具体水果:Fruit_apple,Fruit_banana,Fruit_mango,Fruit_orange
- 类图如图4所示
图
4 简单工厂模式类图
3.策略模式及其实现类
- 模式定义
在策略模式中,定义一系列优惠方法,将每一个方法封装起来,并让它们可以相互替换,让方法独立于使用它的客户而变化。一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
- 模式结构
抽象策略类:CashSuper
具体策略类:CashNormal,Cashvip,Cashsvip
- 类图如图5所示
图
5 策略模式类图
四 部分代码展示
public class SingletonPatternDemo {
public static void main(String[] args) {
//获取唯一可用的对象
SingleGuest object = SingleGuest.getInstance();
//显示消息
object.showMessage();
}
}
//工厂类:
class Fruit_Factory{
public static Fruit createFruit(String type) throws UnsupportedShapeException {
Fruit fruit;
if ("苹果".equals(type)) {
fruit = new Fruit_apple();
}
else if ("香蕉".equals(type)) {
fruit = new Fruit_banana();
}
else if ("芒果".equals(type)) {
fruit = new Fruit_mango(); }
else {
fruit = new Fruit_orange();
}
return fruit;
}}
public interface Fruit {
//抽象产品类
public void product();
}
public class Fruit_apple implements Fruit{
public void product(){
System.out.println("拿走苹果");
}
}
public class Fruit_banana implements Fruit{
public void product(){
System.out.println("拿走香蕉");
}}
public class Fruit_mango implements Fruit{
public void product(){
System.out.println("拿走芒果");
}}
public class Fruit_orange implements Fruit{
public void product(){
System.out.println("拿走橘子");
}
}
//策略模式实现打折
public class CashContext {
CashSuper cashSuper;
public CashContext(String type) {//传入打折或返现类型
switch (type) {
case "normal":
cashSuper = new CashNormal();
break;
case "vip":
cashSuper = new Cashvip();
break;
case "svip":
cashSuper = new Cashsvip();
break;
}
this.cashSuper = cashSuper;
}
public CashContext(){
cashSuper = new CashNormal();
}
public CashContext(double rebate){
cashSuper = new Cashvip();
}
public CashContext(double moneyCondition,double moneyReturn){
cashSuper = new Cashsvip();
}
public double acceptMoney(double money){
return cashSuper.acceptMoney(money);
}
}
interface CashSuper {
double acceptMoney(double money);}
class Cashvip implements CashSuper{
@Override
public double acceptMoney(double money) {
return money*0.7;
}}
public class CashNormal implements CashSuper {
@Override
public double acceptMoney(double money) {
return money;
}}
public class Cashsvip implements CashSuper {
@Override
public double acceptMoney(double money) {
return money*0.6;
}
}
五 优点
具有很好的可扩展性。
有不足之处欢迎大家指正!