前几天自己敲了一个小damo,利用抽象工厂+反射去写了了一个计算器,主要是用来实现用配置类来添加新功能,而尽可能少的去动现在的代码,更加的符合设计模式中的开闭原则
接口类
public interface ICount {
String calculationResults(String[] s);
}
加法实现类
public class Plus implements ICount {
/**
* 加法运算
* @param s
* @return
*/
public String calculationResults(String[] s){
if (
s[1]==null
){
return s[0];
}
return String.valueOf(Double.parseDouble(s[0])+Double.parseDouble(s[1]));
}
}
减法实现类
public class Less implements ICount {
/**
* 减法运算
* @param s
* @return
*/
public String calculationResults(String[] s){
if (
s[1]==null
){
return s[0];
}
return String.valueOf(Double.parseDouble(s[0])-Double.parseDouble(s[1]));
}
}
工厂类:通过读取配置文件,实例化出具体的计算类
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class XMLUtil {
public static Object getBean(String symbol) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Properties properties = new Properties();
InputStream inputStream = Object.class.getResourceAsStream("/prizhi.properties");
try {
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
String a = (String) properties.get(symbol);
Class classType = Class.forName(a);
return classType.newInstance();
}
}
客户端
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.Properties;
import static java.lang.Class.forName;
public class SimpleCalculator extends JFrame implements ActionListener {
private String[] KEYS={"7","8","9","4","5","6","1","2","3","+","0","=","-","C"};
private JButton keys[]=new JButton[KEYS.length];
private JTextField resultText = new JTextField("0.0");
private String b="";
private String symbol;
public SimpleCalculator(){
super("计算器");
// KEYS=string;
this.setLayout(null);
resultText.setBounds(20, 5, 200, 40);
resultText.setHorizontalAlignment(JTextField.RIGHT);
resultText.setEditable(false);
this.add(resultText);
int x=20,y=55;
for (int i=0;i<KEYS.length;i++)
{
keys[i] = new JButton();
keys[i].setText(KEYS[i]);
keys[i].setBounds(x, y, 60, 40);
if(x<140)
{
x+=65;
}
else
{
x = 20;
y+=45;
}
this.add(keys[i]);
}
for (int i = 0; i <KEYS.length; i++)
{
keys[i].addActionListener(this);
}
this.setResizable(false);
this.setBounds(500, 200, 255, 400);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String arg[])
{
SimpleCalculator a=new SimpleCalculator();
}
@Override
public void actionPerformed(ActionEvent e) {
// 获取点击
String label = e.getActionCommand();
// 判断点击的是否是数字
if (label=="="||label=="C"||label=="-"||label=="+")
{
//判断为清空数据
if(label=="C")
{
this.b="";
resultText.setText("0");
}else if(label=="="){//判断为等于
String result = getString();
this.b=result+"";
resultText.setText(this.b);
}
else
{
symbol =label;
String result = getString();
this.b=result+label;
resultText.setText(this.b);
}
}
else
{
this.b=this.b+label;
resultText.setText(this.b);
}
}
private String getString() {
String s[] = operation(this.b);
String result = null;
try {
result = Result(s);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
return result;
}
private String Result(String[] s) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
ICount iCount=(ICount) XMLUtil.getBean(symbol);
return iCount.calculationResults(s);
}
/**
* 遍历字符串数据
* @param b 输入的字符串
* @return 字符串数组
*/
private String[] operation(String b) {
String s="";
String result[]=new String[100];
int j=0 ,a=0;
for (int i=0;i<b.length();i++) {
if ("0123456789.".indexOf(b.charAt(i)) >= 0) {
s = "";
// 获取符号之前的字符串
for (; i < b.length() && "0123456789.".indexOf(b.charAt(i)) >= 0; i++) {
s = s + b.charAt(i);
}
i--;
result[j] = s;
j++;
}else {
// 获取符号
symbol =String.valueOf(b.charAt(i));
}
}
return result;
}
}