java的23种设计模式

来源:互联网 发布:什么是淘宝小号和大号 编辑:程序博客网 时间:2024/06/08 17:24

一、单例模式

作用:

1 为了避免其他程序过多的建立该类对象。禁止其他程序建立该类对象。

2 为了其他程序可以访问该类对象,在本类中自定义一个对象。

3 方便其他程序对自定义类的对象的访问,对外提供一些访问方式。

实现:

1将构造函数私有化

2在类中创建一个私有的本类对象

3提供一个用类名调用的公有方法获取该对象。

代码:

class Single {     private static Single s = new Single(); // 恶汉式     private Single() {     }     public static Single getInstance() {       returns;    }} class Single2 {    private static Single2 s = null; // 懒汉     private Single2() {     }     public static Single2 getInstance() {       if (s ==null) {           s = new Single2();       }       returns;    }}
二、模板模式

作用:

解决某类事情的步骤有些是固定的,有些是会发生变化的,那么这时候我们可以为这类事情提供一个模板代码,从而提高效率 。

实现:

1. 先写出解决该类事情其中 的一件的解决方案。
2. 分析代码,把会发生变化的代码抽取出来独立成一个方法。把该方法描述成一个抽象的方法。
3. 使用final修饰模板方法,防止别人 重写你的模板方法。

代码:

abstract class MyRuntime{public final void getTime(){long startTime = System.currentTimeMillis();//记录开始的时间code();long endTime = System.currentTimeMillis();  //记录结束的时间.System.out.println("运行时间 :"+ (endTime-startTime));}public abstract void code();}class Demo11 extends MyRuntime{public static void main(String[] args) {Demo11 d = new Demo11();d.getTime();}//code方法内部就写要计算运行时间 的代码;public  void code(){int i = 0;while(i<100){System.out.println("i="+i);i++;}}}

三:装饰者设计模式

作用:增强一个类的功能,而且还可以让这些装饰类互相装饰。

步骤:
1. 在装饰类的内部维护一个被装饰类的引用。
2. 让装饰类有一个共同的父类或者是父接口。

代码:

import java.io.IOException;//带行号的缓冲输入字符流class BufferedLineNum2  extends BufferedReader{  //在内部维护一个被装饰类的引用。BufferedReader bufferedReader;int count = 1;public BufferedLineNum2(BufferedReader bufferedReader){super(bufferedReader);// 注意: 该语句没有任何的作用,只不过是为了让代码不报错。this.bufferedReader = bufferedReader;}public String readLine() throws IOException{String line = bufferedReader.readLine();if(line==null){return null;}line = count+" "+line;count++;return line;}} //带分号缓冲输入字符流class BufferedSemi2 extends BufferedReader{  //为什么要继承?  是为了让这些装饰类的对象可以作为参数进行传递,达到互相装饰 的效果。//在内部维护一个被装饰类的引用。BufferedReader bufferedReader;public BufferedSemi2(BufferedReader bufferedReader){ // new BuffereLineNum();super(bufferedReader);// 注意: 该语句没有任何的作用,只不过是为了让代码不报错。this.bufferedReader = bufferedReader;}public String readLine() throws IOException{String line = bufferedReader.readLine();  //如果这里的ReadLine方法是调用了buffereLineNum的readLine方法,问题马上解决。if(line==null){return null;}line = line +";";return line;}}//缓冲类带双引号class BufferedQuto2 extends BufferedReader{//在内部维护一个被装饰的类BufferedReader bufferedReader;public BufferedQuto2(BufferedReader bufferedReader){  //new  BufferedSemi2();super(bufferedReader) ; //只是为了让代码不报错..this.bufferedReader = bufferedReader;}public String readLine() throws IOException{String line = bufferedReader.readLine();  //如果这里的ReadLine方法是调用了buffereLineNum的readLine方法,问题马上解决。if(line==null){return null;}line = "\""+line +"\"";return line;}}public class Demo2 {public static void main(String[] args) throws IOException {File file = new File("F:\\Demo1.java");FileReader fileReader = new FileReader(file);//建立缓冲输入字符流BufferedReader bufferedReader = new BufferedReader(fileReader);//建立带行号的缓冲输入字符流BufferedLineNum2 bufferedLineNum = new BufferedLineNum2(bufferedReader);//带分号的缓冲输入字符流BufferedSemi2 bufferedSemi2 = new BufferedSemi2(bufferedLineNum);//带双引号的缓冲输入字符流BufferedQuto2 bufferedQuto2 = new  BufferedQuto2(bufferedSemi2);String line = null;while((line = bufferedQuto2.readLine())!=null){System.out.println(line);}}}