設計模式-簡單工廠模式&策略模式

讀了大話設計模式後的總結,也是寫給以後的自己看吧。語言: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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章