个人理解,如有不足和出错的地方,欢迎指出
本文将用三种模式实现同一个程序,程序的功能是输入非负整数(会判断输入的合法性),判断奇偶性
界面如下:
校验奇偶性.png
1.单例模式
单例顾名思义就是只有一个实例,下面的Num类就是单例类
工程中只有两个文件:
parity.java
Num.java
parity.java:
public class parity{ public static void main(String[] args) { (Num.getInstance()).readInput(); } }
Num.java:
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Num{ private static Num instance=new Num(); private Num(){ } public static Num getInstance(){ return instance; } public void readInput(){ Scanner in=new Scanner(System.in); boolean isEven=false; String next; System.out.println("input your datas:"); //输入部分 while(in.hasNext()){ next=in.next(); Pattern p=Pattern.compile("[0-9]*");//正则表达式的方式验证输入 //的字符串是否为非负整数 Matcher m=p.matcher(next); if(m.matches()){//输入的字符串是非负整数 isEven= Parity(Integer.parseInt(next)); if(isEven) System.out.println(next+" is even"); else System.out.println(next+" is odd"); }else{ System.out.println(next+" is not the the positive integer or zero"); } } } public boolean Parity(int number){ if(number%2==0){ return true; }else{ return false; } } }
要实现单体模式,拿Num类来说,首先构造函数必须私有,保证无法在Num类外创建Num的实例,除此应该有一个public(Num外可访问)、static(无需创建实例即可访问)的方法,用于get到唯一的实例。
2.简单工厂模式
定义一个工厂类,类中定义一个静态方法,依据传入的参数,生成对应的具体产品对象,返回的是这些具体产品对象的公共接口
工程中有三个文件:
Factory.java(自定义的工厂类)
public class Factory{ public static integer createProduct(String type){//工厂方法 if(type.equals("even")){ return new Even(); } if(type.equals("odd")){ return new Odd(); } else return null; } }
integer.java()定义接口和实现类)
public interface integer{ public boolean judge(int number); } class Even implements integer{ @Override public boolean judge(int number){ if(number%2==0) return true; else return false; } } class Odd implements integer{ @Override public boolean judge(int number){ if(number%2!=0) return true; else return false; } }
Main.java(接受输入进行判断)
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main{ public static void main(String[] args) { Scanner in=new Scanner(System.in); boolean isEven=false; String next; System.out.println("input your datas:"); while(in.hasNext()){ next=in.next(); Pattern p=Pattern.compile("[0-9]*"); Matcher m=p.matcher(next); if(m.matches()){ integer number=Factory.createProduct("even"); isEven=number.judge(Integer.parseInt(next)); if(isEven){ System.out.println(next+" is even"); }else{ System.out.println(next+" is odd"); } }else{ System.out.println(next+" is not the positive integer or zero"); } } } }
3.MVC模式
MVC是3种里面最复杂的
M-----model层,负责数据的存储和数据的业务处理(如网络请求数据等),数据更新后回调通知视图层(view层)更新界面
V-----view层,显示界面,将用户的输入数据和指令传递给C层进行处理
C----controller层,负责从V层读取用户输入的数据和指令,调用M层获取数据,以实现M与V一定程度上的解耦
程序有4个文件
Main.java
view.java
model.java(数据的业务处理,与bean.java同属于M层)
bean.java(存储数据结构,与model.java同属于M层)
controller.java
Main.java
public class Main{ public static void main(String[] args) { view mView=new view(); } }
view.java
import java.util.Scanner; public class view{//视图层,负责界面的显示、传递用户指令和用户输入 //的数据给C层 private controller mController; public view(){ mController=new controller(); readInput(); } public void Print(String num,boolean isEven){ if(isEven){ System.out.println(num+" is even"); }else{ System.out.println(num+" is odd"); } } public void readInput(){ Scanner in=new Scanner(System.in); boolean isEven=false; String next; System.out.println("input your datas:"); //读取用户输入的数据,传给mController,OnUpdateListener是一个回//调的接口,当数据更新结束后回调通知V层更新界面 while(in.hasNext()){ next=in.next(); mController.judge(next,new OnUpdateListener(){ @Override public void onSuccess(Object oj){ bean data=(bean)oj; Print(String.valueOf(data.getNum()),data.getIsEven()); } @Override public void onFail(String message){ System.out.println(message); } }); } } public interface OnUpdateListener{ void onSuccess(Object oj); void onFail(String message); } }
controller.java
public class controller{//控制层,接受视图层的用户数据和指令,调用model层获取数据 private model mModel; private view mView; public controller(){ mModel=new model(); } public void judge(String input, view.OnUpdateListener listener){ mModel.requestData(input,listener); } }
接下来看M层
model.java
import java.util.regex.Matcher; import java.util.regex.Pattern; public class model{//数据层的逻辑处理 private bean data; public model(){ data=new bean(); } public void requestData(String input,final view.OnUpdateListener listener){ Pattern p=Pattern.compile("[0-9]*"); Matcher m=p.matcher(input); boolean isEven=false; if(m.matches()){ int num=Integer.parseInt(input); data.setNum(num); if(num%2==0) { data.setIsEven(true); }else{ data.setIsEven(false); } listener.onSuccess(data);//回调 }else{ listener.onFail(input+" is not the positive integer");//回调 } } }
bean.java
public class bean{//数据层的数据对象 private int num; private boolean isEven; public int getNum(){ return num; } public void setNum(int num){ this.num=num; } public boolean getIsEven(){ return isEven; } public void setIsEven(boolean isEven){ this.isEven=isEven; } }
作者:LingoGuo
链接:http://www.jianshu.com/p/118a94bac633
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。