读了大话设计模式后的总结,也是写给以后的自己看吧。语言: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");
}
}}