讀了大話設計模式後的總結,也是寫給以後的自己看吧。語言: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");
}
}}