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");
}
}