Java设计模式小结

1:设计模式(理解)

(1)面试对象的常见设计原则

        单一
        开闭
        里氏
        依赖注入
        接口
        迪米特

(2)设计模式概述和分类

        A:经验的总结
        B:三类
            创建型
            结构型
            行为型

(3)改进的设计模式

        A:简单工厂模式
package day24_Pattern;

public abstract class Animal {
    public abstract void eat();
}

package day24_Pattern;

public class Cat extends Animal {

    @Override
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("猫吃鱼");
    }

}

package day24_Pattern;

public class Dog extends Animal {

    @Override
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("狗吃肉");
    }

}

package day24_Pattern;
/*
 * 工厂类
 * */
public class AnimalFactory {
//  //私有之后,就无法通过new AnimalFactort()实现类的调用
//  //只能通过AnimalFactory.方法名调用
//  private AnimalFactory() {
//      // TODO Auto-generated constructor stub
//  }
//  
//  public static Dog createDog(){
//      return new Dog();
//  }
//  
//  public static Cat createCat(){
//      return new Cat();
//  }

    public static Animal createAnimal(String type){
        if("dog".equals(type)){
            return new Dog();
        }else if("cat".equals(type)){
            return new Cat();
        }else {
            return null;
        }
    }
}

package day24_Pattern;
/*
 * 简单工厂模式
 * */
public class AnimalDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //具体类调用
        Dog d = new Dog();
        d.eat();
        Cat c = new Cat();
        c.eat();
        System.out.println("--------------");

        //工厂有了之后,通过工厂给造
        Dog dog = AnimalFactory.createDog();
        dog.eat();
        Cat cat = AnimalFactory.createCat();
        cat.eat();  
        System.out.println("--------------");   

        //工厂改进后
        Animal a = AnimalFactory.createAnimal("dog");
        a.eat();
        a = AnimalFactory.createAnimal("cat");
        a.eat();

        //NullPointerException
        a=AnimalFactory.createAnimal("pig");
        if(a!=null){
            a.eat();
        }else{
            System.out.println("对不起,暂时不提供这种动物");
        }
    }
}
        B:工厂方法模式    
package day24_Pattern2;
/*
 * 抽象类
 * */
public abstract class Animal {
    public abstract void eat();//抽象方法
}

package day24_Pattern2;
/*
 * 工厂接口
 * */
public interface Factory {
    public abstract Animal CreateAnimal();//接口方法
}


package day24_Pattern2;

public class Cat extends Animal {

    @Override
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("猫吃鱼");
    }

}

package day24_Pattern2;

public class CatFactory implements Factory {

    @Override
    public Animal CreateAnimal() {
        // TODO Auto-generated method stub
        return new Cat();
    }

}

package day24_Pattern2;

public class Dog extends Animal {
    @Override
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("狗吃肉");
    }

}

package day24_Pattern2;

public class DogFactory implements Factory {

    @Override
    public Animal CreateAnimal() {
        // TODO Auto-generated method stub
        return new Dog();
    }

}

package day24_Pattern2;

/*
*工厂方法模式:
*   工厂方法模式中抽象工厂类负责定义创建对象的接口,
*   具体对象的创建工作由继承抽象工厂的具体类实现
*
*优点:客户端不需要负责对象的创建,从而明确了各个类的职责,如果有新的对象增加,只需要增加一个具体的类和具体的工厂即可
*   ,不影响已有的代码,后期维护容易,增强了系统的拓展性。
*
*缺点:需要额外的编写代码,增加了工作量
*/
public class AnimalDemo {
    public static void main(String[] args) {
        // 需求:我要只狗
        Factory f = new DogFactory();
        Animal a = f.CreateAnimal();
        a.eat();
        System.out.println("---------------");
        //需求:我要买只猫
        f=new CatFactory();
        a = f.CreateAnimal();
        a.eat();
    }
}
        C:单例模式(掌握)
            a:饿汉式
package day24_Pattern3;

public class Student {
    //私有构造方法
    private Student() {
        // TODO Auto-generated constructor stub
    }

    //自己造一个,饿汉式
    //静态方法只能访问静态成员变量
    //为了不让外界直接访问修改这个值,加private
    private static Student s=new Student();

    //提供一个公共访问的方法
    //为了保证外界能够直接使用该方法,加静态
    public static Student getStudent(){
        return s;
    }
}

package day24_Pattern3;
/*
 * 单例模式:(经常面试)
 *      保证在内存中只有一个对象
 * 
 * 如何保证类在内存中只有一个对象呢?
 *      A:把构造方法私有
 *      B:在成员位置自己穿件一个对象
 *      C:通过一个公共的方法提供访问
 * 
 * 饿汉式:类一加载就创建对象
 * 
 * 
 * */
public class StudentDemo {
    public static void main(String[] args) {
//      Student s1 = new Student();
//      Student s2 = new Student();
//      System.out.println(s1==s2);//false

        //通过单例如何得到对象呢?

        //Student.s=null;


        Student s1 = Student.getStudent();
        Student s2 = Student.getStudent();
        System.out.println(s1==s2);//true
        System.out.println(s1);
        System.out.println(s2);
    }
}
            b:懒汉式
package day24_Pattern3;

public class Teacher {
    private Teacher() {
        // TODO Auto-generated constructor stub
    }

    //懒汉式
    private static Teacher t=null;

    public synchronized static Teacher getTeacher(){
        if(t==null){
            //直到用的时候,才创建。
            t=new Teacher();
        }
        return t;
    }
}

package day24_Pattern3;
/*
 * 单例模式:
 *      饿汉式:类一记载就创建对象
 *      懒汉式:用的时候,才去创建对象
 * 
 * 面试题:单例模式的思想是什么?请写一个代码体现
 * 
 *      开发:饿汉式(是不会出问题的单例模式)
 *      面试:懒汉式(可能会出现问题的单例模式)
 *          A:懒加载(延迟加载)
 *          B:线程安全问题
 *              a:是否多线程问题   是   
 *              b:是否有共享数据   是
 *              c:是否有多条语句操作共享数据 是
 * */
public class TeacherDemo {
    public static void main(String[] args) {
        Teacher t1 = Teacher.getTeacher();
        Teacher t2 = Teacher.getTeacher();
        System.out.println(t1==t2);//true
        System.out.println(t1);
        System.out.println(t2);
    }
}
D:装饰设计模式

这里写图片描述

工具类:
package day27_Pattern;

public class ForDemo extends GetTime {

    @Override
    public void code() {
        // TODO Auto-generated method stub
        for(int i=0;i<10000;i++){
            System.out.println(i);
        }
    }

}

工具类:
package day27_Pattern;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class IODemo extends GetTime {

    @Override
    public void code() {
        // TODO Auto-generated method stub
        try {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.avi"));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));

            byte[]bys=new byte[1024];
            int len=0;
            while((len=bis.read(bys))!=-1){
                bos.write(bys, 0, len);
            }

            bis.close();
            bos.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

实现类:
package day27_Pattern;
/*
 * 需求:请给我计算一段代码的运行时间
 * */
public abstract class GetTime {
    public long getTime(){
        long start=System.currentTimeMillis();
        code();
        long end=System.currentTimeMillis();
        return end-start;
    }
    //定义抽象方法,具体实现,由继承的子类实现
    public abstract void code();
}

测试类:
package day27_Pattern;
/*
 * 模板设计模式实现具体功能具体实现,模板只负责计算时间
 * 
 * 优点:使用模板方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求
 * 
 * 缺点:如果算法骨架有修改的话,则需要修改抽象类
 * */
public class GetTimeTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        GetTime gt = new ForDemo();//多态
        System.out.println(gt.getTime()+"毫秒");
        System.out.println("--------------------");

        GetTime io = new IODemo();
        System.out.println(io.getTime()+"毫秒");
    }

}
E:模板设计模式
接口:
package day27_Pattern2;

public interface Phone {
    public abstract void call();
}

实现类:
package day27_Pattern2;

public class Iphone implements Phone {

    @Override
    public void call() {
        // TODO Auto-generated method stub
        System.out.println("手机可以打电话了");
    }

}

实现类:
package day27_Pattern2;

public abstract class PhoneDecorate implements Phone {
    private Phone p;
    public PhoneDecorate(Phone p) {
        // TODO Auto-generated constructor stub
        this.p=p;
    }
    @Override
    public void call() {
        // TODO Auto-generated method stub
        this.p.call();
    }

}

继承类:
package day27_Pattern2;

public class MusicPhone extends PhoneDecorate {

    public MusicPhone(Phone p) {
        super(p);
        // TODO Auto-generated constructor stub
    }
    @Override
    public void call() {
        // TODO Auto-generated method stub
        super.call();
        System.out.println("可以听音乐了");
    }

}

继承类:
package day27_Pattern2;

public class RingPhone extends PhoneDecorate {

    public RingPhone(Phone p) {
        super(p);
        // TODO Auto-generated constructor stub

    }
    @Override
    public void call() {
        // TODO Auto-generated method stub
        System.out.println("手机可以听彩铃了");
        super.call();
    }

}

测试类:
package day27_Pattern2;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/*
 * 装饰模式:
 *  
 * */
public class PhoneDemo {
    public static void main(String[] args) {
        Phone p = new Iphone();
        p.call();
        System.out.println("----------------");

        //需求:我想在打电话之前听彩铃
        PhoneDecorate pd = new RingPhone(p);
        pd.call();
        System.out.println("----------------");

        //需求:我想在打电话之后听音乐
        MusicPhone mp = new MusicPhone(p);
        mp.call();
        System.out.println("----------------");

        //需求:我想在打电话之前听彩铃,接电话之后听音乐
        pd=new RingPhone(new MusicPhone(p));
        pd.call();

        //想想我们在IO流中的使用
//      
//      InputStream is = System.in;
//      InputStreamReader isr = new InputStreamReader(is);
//      BufferedReader br = new BufferedReader(isr);
        //整合
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));       
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    }
}

(6)Runtime
JDK提供了一个单例模式应用的类
还可以调用DOS命令。

package day24_Pattern3;

import java.io.IOException;

/*
 * Runtime:每个Java应用层序都有一个Runtime类的实例,使应用程序能够与其运行的环境相连接。
 * exec(command)
 * */
public class RunTimeDemo {
    public static void main(String[] args) throws IOException {
        Runtime r = Runtime.getRuntime();
        r.exec("at 12:00 shutdown -s");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值