设计模式-简单工厂模式&策略模式

读了大话设计模式后的总结,也是写给以后的自己看吧。语言:java
个人觉得这本书真的好

简单工厂模式

简单四则计算为例:

1.考虑业务逻辑与界面逻辑分开,让他们的之间耦合度下降,只有分开,才可以达到容易维护和扩展(利用封装)
2.加减乘除等运算分离,修改其中一个不影响另外的几个(利用继承和多态,会产生多个对象)
3.简单工厂模式,解决对象的创建问题。

类图
在这里插入图片描述
运算类:

package caculate;

public class Operation {
	private double numberA=0;
	private double numberB=0;
	public double getNumberA() {
		return numberA;
	}
	public void setNumberA(double numberA) {
		this.numberA = numberA;
	}
	public double getNumberB() {
		return numberB;
	}
	public void setNumberB(double numberB) {
		this.numberB = numberB;
	}
	public double GetResult() throws Exception{
		double result=0;
		return result;
	}
	
}
class OperationAdd extends Operation{
	public double GetResult(){
		double result=0;
		result=getNumberA()+getNumberB();
		return result;
	}
}
class OperationSub extends Operation{
	public double GetResult(){
		double result=0;
		result=getNumberA()-getNumberB();
		return result;
	}
}
class OperationMul extends Operation{
	public double GetResult(){
		double result=0;
		result=getNumberA()*getNumberB();
		return result;
	}
}
class OperationDiv extends Operation{
	public double GetResult() throws Exception{
		double result=0;
		if(getNumberB()==0){
			throw new Exception("除数不能为0");
		}
		result=getNumberA()/getNumberB();
		return result;
	}
}

简单工厂类

package caculate;

public class OperationFactory {
	public static Operation createOperate (String operate) {
		Operation opera=null;
		switch(operate) {
		case "+":
			opera=new Operation Add ();
			break;
		case "-":
			opera=new OperationSub ();
			break;
		case "*":
			opera=new Operation ();
			break;
		case "/":
			opera=new Operation ();
			break;
			default:
				System.out.println("请输入正确的运算符");
		}
		return opera;
	}
}

客户端类

package caculate;

public class Client {
	public static void main(String args[]) throws Exception{
		Operation oper;
		oper=OperationFactory.createOperate("*");
		oper.setNumberA(2);
		oper.setNumberB(4);
		double result=oper.GetResult();
		System.out.println("计算结果:"+result);
	}
}

策略模式

它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用到算法的客户

减少了各种算法类与使用算法类之间的耦合度,封装变化点是面向对象的一种重要的思维

商场促销为例:

在这里插入图片描述

类图
在这里插入图片描述

CashContext类

package Cash;

public class CashContext {
	private CashSuper cs;
	public CashContext(String type){
		switch(type){
		case "正常收费":
			CashNormal cs0=new CashNormal();
			cs=cs0;
			break;
		case "满300返100":
			CashReturn cr1=new CashReturn("300","100");
			cs=cr1;
			break;
		case "打8折":
			
			CashRebate cr2=new CashRebate("0.8");
			cs=cr2;
			break;
		}
	}
	
	public double GetResult(double money){
		return cs.acceptCash(money);
	}
}	

CashSuper类

package Cash;

public abstract class CashSuper {
	public abstract double acceptCash(double money);
}
class CashNormal extends CashSuper{

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		return money;
	}
	
}

class CashRebate extends CashSuper{
	private double moneyRebate=1;
	
	public CashRebate(String moneyRebate){
		this.moneyRebate=Double.parseDouble(moneyRebate);
		
	}
	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		return money * moneyRebate;
	}
	
}

class CashReturn extends CashSuper{
	private double moneyCondition=0;
	private double moneyReturn=0;
	public CashReturn(String moneyCondition,String moneyReturn){
		this.moneyCondition=Double.parseDouble(moneyCondition);
		this.moneyReturn=Double.parseDouble(moneyReturn);
	}
	
	
	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		double result=money;
		if(money>=moneyCondition){
			result=money-moneyReturn;
		}
		return result;
	}
	
}

客户端类

package Cash;

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;



public class Cilent extends JFrame implements ActionListener{
	
	
	private JButton btn1,btn2;
	private JTextField text1,text2;
	private JComboBox<Object> jb;
	private JTextArea ja;
	private JLabel la4;
	
	public Cilent(){
		this.setTitle("商场收银");
		this.setBounds(100, 100, 320, 350);
		this.setLayout(new FlowLayout(FlowLayout.LEFT,20,10));
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
		JLabel la1=new JLabel("单价:");this.add(la1);
		text1=new JTextField(10);
		text1.setText("0.00");
		text1.setHorizontalAlignment(JTextField.RIGHT);
		this.add(text1);
		btn1=new JButton("确定");
		btn1.addActionListener(this);
		this.add(btn1);
		
		
		JLabel la2=new JLabel("数量:");this.add(la2);
		text2=new JTextField(10);
		text2.setText("0");
		text2.setHorizontalAlignment(JTextField.RIGHT);
		this.add(text2);
		btn2=new JButton("重置");
		btn2.addActionListener(this);
		this.add(btn2);
		
		JLabel la5=new JLabel("计算方式:");this.add(la5);
		
		jb=new JComboBox<Object>(new Object []{"正常收费","打8折","打七折","打五折"});
		this.add(jb);
		
		
		ja=new JTextArea(5, 25);this.add(ja);
		
		JLabel la3=new JLabel("总计:");this.add(la3);
		la4=new JLabel("0.00");
		Font font=new Font("宋体",Font.BOLD,50);
		la4.setFont(font);
		this.add(la4);
	
		
		
		this.setVisible(true);
	}
	
	public static void main(String args[]){
		
		System.out.println("启动");
		new Cilent();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource()==btn1){
			double t1=Double.parseDouble(text1.getText());
			double t2=Double.parseDouble(text2.getText());
			CashContext csuper=new CashContext(jb.getSelectedItem().toString());
			double totalPrices=0;
			totalPrices=Double.parseDouble(la4.getText())+csuper.GetResult(t1*t2);
			ja.setText(ja.getText()+"单价:"+t1+"  "+"数量:"+t2+"  "+"总金额:"+t1*t2+"\n");
			la4.setText(String.valueOf(totalPrices));
		}
		if(e.getSource()==btn2){
			text1.setText("0.00");
			text2.setText("0");
		}
	}}

发布了20 篇原创文章 · 获赞 6 · 访问量 4915
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章