Java之23种设计模式汇总

小结:

创建型模式(5种)单例模式简单工厂模式工厂方法模式抽象工厂模式建造者模式原型模式

结构型模式(7种)适配器模式代理模式桥接模式组合模式装饰器模式外观模式亨元模式

行为型模式(11种)责任链模式迭代器模式中介者模式命令模式解释器模式访问者模式策略模式模板方法模式状态模式观察者模式备忘录模式

一:创建型模式(都是用来帮助创建对象滴!!关注对象的创建

1单例模式(Singleton pattern):确保一个类只有一个实例对象, 并提供一个访问该实例的全局访问点

核心代码(以恶汉式为例)---------------------创建一个对象实例

public class SingletonOfHungry {  
    //2:创建类的私有静态成员对象,并直接调用私有构造器传值初始化  
    private static SingletonOfHungry singleton = new SingletonOfHungry();  
      
    //1:创建类的私有构造器  在私有构造方法中加入判断  
private SingletonOfHungry(){  
    //防止反射的暴力破解  
    if(singleton != null){  
        throw new RuntimeException("创建失败");  
    }  
} 
      
    //3:创建类的公有方法,返回该静态成员对象的实例  
    public static SingletonOfHungry getInstance(){  
        return singleton;  
    }  
    //防止序列化与反序列化的漏洞  
private Object readResolve() throws ObjectStreamException{  
    return singleton;  
    }  
} 

2简单工厂模式(Simple factory pattern):工厂类一般是静态方法,通过接收的参数不同来返回不同的对象实

核心代码---------------------创建多个对象实例,对于增加新的产品,需要修改已有代码一个工厂类

public class CarFactory {  
    //创建奥迪类  
    public static Audi createAudi(){  
        return new Audi();  
    }  
    //创建宝马类  
    public static Bwm createBwm(){  
        return new Bwm();  
    }  
    //.....  
}  

3工厂方法模式(Factory method pattern): 简单工厂模式只有一个工厂类,而工厂方法模式有一组实现了相同接口的工厂类

核心代码---------------------创建多个对象实例,但是增加新的产品需要增加大量类实现接口(一个共有工厂接口

public interface CarFactory {  
    public abstract Car createCar();  
} 

4抽象工厂模式(Abstract factory pattern): 用来生产不同产品族的全部产品,可以看做是工厂方法模式的升级版(一条产品族!

核心代码---------------------创建多个对象实例,用来构建整条产品族,对于增加新品无能为力(一个产品族接口

public interface CarFactory {  
    // 创建引擎对象  
    public abstract Engine createEngine();  
  
    // 创建座椅对象  
    public abstract Seat createSeat();  
  
    // 创建轮胎对象  
    public abstract Tyre createTyre();  
} 

5建造者模式(Builder pattern): 当我们需要构造一个复杂的产品,比如:手机,汽车等。我们不仅需要构建各个零件,还有将这些零件组装在一起。分离了对象子组件的单独构造由Bulider负责)和装配由Director负责),实现了构建和装配的解耦(手机各种零件组装!!

核心代码---------------------创建多个对象实例,构建复杂产品,将构造和装配分离(一个构造器接口一个装配器接口

public interface IphoneBuilder {  
    //各个部件构造器  
    public abstract Battery builderBattery();  
    public abstract Processor builderProcessor();  
    public abstract Shell Shell();  
}  
public interface IphoneDirectory {  
    //手机组装器  
    public abstract Iphone directIphone();  
}  

6原型模式(Prototype pattern):短时间内需要创建大量对象,并且new的过程比较耗时,可以考虑原型模式(克隆羊!!

核心代码---------------------创建多个对象实例,克隆!拷贝!(实现一个Cloneable接口引入一个clone方法

    //加入clone方法  
    protected Object clone() throws CloneNotSupportedException {  
        return super.clone();  
    } 

二:结构型模式(都是用来实现程序结构上的松耦合!!关注类和对象的组织

1适配器模式(Adapter pattern):将一个类的接口转换成客户希望的另外一个接口(网线转换头,用过没!插usb上滴!!就是它!

核心代码---------------------使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

/* 
 * 相当于电脑和键盘的转换器 
 * 实现usb接口,在usb接口中重写解决方法调用键盘的需求方法 
 */  
  //适配器
public class Adapter implements Target{  
    private Adaptee adaptee;  
  
    public Adapter() {  
    }  
  
    public Adapter(Adaptee adaptee) {  
        super();  
        this.adaptee = adaptee;  
    }  
  
    @Override  
    public void handle() {  
        adaptee.request();  
    }  
      
}  

2代理模式(Proxy pattern): 通过代理,控制对对象的访问!(张学友代理人!除了唱歌外,啥都干!!

核心代码(以动态代理为例---------------------将统一的流程控制放到代理角色中处理!

/* 
 * 动态代理 
 */  
  
public class StarHandler implements InvocationHandler{  
    private Star star;  
      
    public StarHandler(Star star) {  
        super();  
        this.star = star;  
    }  
  
    //核心方法  
    public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        method.invoke(star, args);  
        return null;  
    }  
  
}

客户端调用

public class Client {  
    public static void main(String[] args) {  
        Star star = new RealStar();  
        StarHandler handler = new StarHandler(star);  
        Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);  
        proxy.confer();  
        proxy.contract();  
        proxy.book();  
        proxy.sing();  
        proxy.collect();  
    }  
}  

3桥接模式(Bridge pattern): 两个变化维度连接起来,使得各个维度都可以独立的变化一座桥,连接两个村庄

核心代码---------------------在一个维度中引用另一个维度,当做桥,连接两个维度

/*
 * 品牌维度
 */
public interface Brand {
	public abstract void sale();
}

/*
 * 具体品牌
 */
class Lenovo implements Brand{

	public void sale() {
		System.out.println("销售联想笔记本");
	}
	
}
class Apple implements Brand{

	public void sale() {
		System.out.println("销售苹果笔记本");
	}
	
}
/*
 *	电脑种类维度
 */
public class ComputerClass {
	private Brand brand;

	public ComputerClass(Brand brand) {
		super();
		this.brand = brand;
	}
	
	public void sale(){
		brand.sale();
	}
}
/*
 * 具体电脑种类
 */
//台式机
class DeskTops extends ComputerClass{

	public DeskTops(Brand brand) {
		super(brand);
	}
	
	public void sale(){
		super.sale();
		System.out.println("销售台式机");
	}
}
//笔记本
class LapTops extends ComputerClass{

	public LapTops(Brand brand) {
		super(brand);
	}
	
	public void sale(){
		super.sale();
		System.out.println("销售笔记本");
	}
}

4组合模式(Composite pattern): 把部分和整体的关系用树形结构来表示,从而使客户端可以使用同一的方式处理部分对象和整体对象

核心代码---------------------三个接口(抽象(Component),叶子(Leaf),容器(Composite)

/*
 * 抽象组件
 */
public interface Component {
	public abstract void operation();
}

/*
 * 叶子组件
 */
interface Leaf extends Component{
	
}

/*
 * 容器组件
 */
interface Composite extends Component{
	//添加组件
	public abstract void add(Component c);
	//删除组件
	public abstract void remove(Component c);
	//返回组件
	public abstract Component getChild(int index);
}

5装饰器模式(Decorator pattern): 动态的为一个对象增加新的功能(刮腻子!!刮大白!!墙就具有了光滑特性)

核心代码---------------------抽象构件,具体构件角色,装饰器,具体装饰对象

/*
 * 抽象构件 --军用战车
 */
public interface ICar {
	public abstract void move();
}

/*
 * 具体构件角色,即真实对象(ConcreteComponent)
 */
class Car implements ICar{

	public void move() {
		System.out.println("陆地作战!");
	}
	
}
/*
 * 装饰器
 */
class SuperCar implements ICar{
	//持有具体构件引用
	protected ICar car;
	
	public SuperCar(ICar car) {
		super();
		this.car = car;
	}

	public void move() {
		car.move();
	}
}
/*
 * 具体装饰对象1(ConcreteDecorator)
 */
class FlyCar extends SuperCar{
	
	public FlyCar(ICar car) {
		super(car); 
	}
	
	//新增方法
	public void fly(){
		System.out.println("空中作战!");
	}
	
	public void move() {
		car.move();
		fly();
	}
	
}

/*
 * 具体装饰对象2(ConcreteDecorator)
 */
class WaterCar extends SuperCar{
	
	public WaterCar(ICar car) {
		super(car);
	}
	
	//新增方法
	public void swim(){
		System.out.println("水中作战!");
	}
	
	public void move() {
		car.move();
		swim();
	}
	
}

6外观模式(Facade pattern): 为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用(酒店服务台买单!!

核心代码---------------------提供一个门面

/* 
 * 门面,外观模式之代理人 
 */  
public class Register {  
    public void regist(){  
        //税务局登记  
        Tax tax = new XuzhouTax();  
        tax.sign();  
        //质检局检测  
        Check check = new XuzhouCheck();  
        check.check();  
        //银行开户  
        Bank bank = new PostBank();  
        bank.open();  
    }  
}  

7亨元模式(Flyweight Pattern): 内存属于稀缺资源,不要随便浪费,如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存(围棋中的黑白棋没有必要定义几百个对象!!!

核心代码---------------------抽象享元类,具体享元类,享元工厂类,外部状态类

/*
 * 享元工厂类
 */
import java.util.HashMap;

public class ChessFlyWeightFactory {
	private static HashMap<String, ChessFlyWeight> map = new HashMap<String, ChessFlyWeight>();
	public static ChessFlyWeight getChess(String color){
		if(map.get(color) != null){
			return map.get(color);
		}else {
			ChessFlyWeight cf = new ConcreteChess(color);
			map.put(color, cf) ;
			return cf;
		}
	}
}

三:行为型模式(关注对象之间的相互交互,相互通信与相互协作)

1责任链模式(Chain of responsibility pattern): 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能,则传递给下一个对象多套if else 的完美替代!!!

核心代码---------------------抽象责任人

/*
 * 抽象领导类
 */
public abstract class AbstractLeader {
	protected String name;    
	protected AbstractLeader nextLeader;  //责任链上的后继对象
	
	public AbstractLeader(String name) {
		super();
		this.name = name;
	}
	//设定责任链上的后继对象
	public void setNextLeader(AbstractLeader nextLeader) {
		this.nextLeader = nextLeader;
	}

	/*
	 * 抽象方法,处理请求
	 */
	public abstract void handleRequest(HomeRequest request);
}

2迭代器模式(Iterator pattern): 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露其内部的表示(集合中Iterator!!

核心代码---------------------迭代器接口,聚合类对象

/* 
 * 自定义聚合类 
 */  
public class ConcreteAggregate {  
    private List<Object> list = new ArrayList<Object>();  
    public void addObject(Object obj){  
        this.list.add(obj);  
    }  
    public void removeObject(Object obj){  
        this.list.remove(obj);  
    }  
    public List<Object> getList(){  
        return list;  
    }  
    public void setList(List<Object> list){  
        this.list = list;  
    }    
    //获得迭代器  
    public MyIterator creareIterator(){  
        return new ConcreterIterator();  
    }   
    /* 
     * 定义一个内部类,实现迭代器接口,内部类可以直接访问外部类成员变量 
     */  
    private class ConcreterIterator implements MyIterator{  
        private int cursor; //定义游标用于记录遍历时的位置  
        @Override  
        public void first() {  
            cursor = 0;  
        }   
        @Override  
        public void next() {  
            if(cursor < list.size()){  
                cursor++;  
            }  
        }  
        @Override  
        public boolean hasNext() {  
            if(cursor < list.size()){  
                return true;  
            }  
            return false;  
        }  
        @Override  
        public boolean isFirst() {  
            return cursor == 0;  
        }  
        @Override  
        public boolean isLast() {  
            return cursor == list.size();  
        }  
  
        @Override  
        public Object getCurrentObj() {  
            return list.get(cursor);  
        }     
    }  
}  

3中介者模式(Mediator pattern) : 解耦多个同事对象之间的交互关系(总经理协调各部门!!

核心代码---------------------各部门抽象,中介者抽象

/*
 * 各个部门抽象
 */
public interface Department {
	void selfAction();//本部门事物
	void outAction(); //向中介者发出申请
}
/*
 * 中介者---总经理抽象
 */
public interface Mediator {
	void register(String name,Department d);
	void commond(String name);
}

4命令模式(Command pattern):  将"请求"封闭成对象,以便使用不同的请求,队列或者日志来参数化其他对象, 命令模式也支持可撤销的操作

核心代码---------------------抽象命令类,具体命令类,调用者/请求者,接受者

/*
 * 命令
 */
public interface Command {
	void execute();
}
/*
 * 具体命令实现类
 */
class ConcreteCommand implements Command{
	//持有命令执行者的引用
	private Receiver  receiver;
	
	public ConcreteCommand(Receiver receiver) {
		super();
		this.receiver = receiver;
	}

	public void execute() {
		//执行前可以做一些处理
		receiver.action();
		//执行后也可以做一些处理
	}
	
}
/*
 * 调用者,发起者
 */
public class Invoke {
	private Command command;

	public Invoke(Command command) {
		super();
		this.command = command;
	}
	//业务方法,调用命令类的方法
	public void call(){
		//执行前可以做一些处理
		command.execute();
		//执行后也可以做一些处理
	}
}
/*
 * 真正的命令执行者
 */
public class Receiver {
	public void action(){
		System.out.println("命令已经被我执行!");
	}
}

5解释器模式(Interpreter pattern): 使用解释器模式为语言创建解释器

6访问者模式(Strategy pattern): 我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变

7策略模式(Strategy pattern): 分离算法,选择实现

核心代码---------------------策略交互类

/* 
 * 负责和具体策略交互---使得具体算法和客户端分离 
 */  
public class Context {  
    private Strategy strategy;  
  
    public Context(Strategy strategy) {  
        super();  
        this.strategy = strategy;  
    }  
  
    public void setStrategy(Strategy strategy) {  
        this.strategy = strategy;  
    }  
      
    //调度方法  
    public void getPrice(double price){  
        System.out.println("您的价格为:" + strategy.getPrice(price) + "元!");   
    }  
}  

8模板方法模式(Template method pattern): 处理步骤父类中定义好,具体实现延迟到子类中定义(方法回调!钩子方法!

核心代码---------------------模块方法类

public abstract class BankTemplateMethod {  
    //具体方法  
    public void takeNumber(){  
        System.out.println("排队取号!");  
    }  
      
    //办理具体业务,钩子方法  
    public abstract void transact();  
      
    //具体方法  
    public void evaluate() {  
        System.out.println("反馈评分!");  
    }  
      
    //模板方法  
    public final void process(){  
        this.takeNumber();  
        this.transact();  
        this.evaluate();  
    }  
}  

9状态模式(State pattern): 解决系统中复杂对象的状态转换以及不同状态下行为的封装问题(红灯停,绿灯行,黄灯亮了等一等!

核心代码---------------------环境类

/* 
 * 环境类,表示当前房间状态,根据条件做状态切换 
 */  
public class HouseContext {  
    private State state;  
  
    public void setState(State state) {  
        this.state = state;  
        System.out.println("状态切换!");  
        state.handle();  
    }  
      
}  

10观察者模式(Observer pattern): 在对象之间定义一对多的依赖,这样一来, 当一个对象改变状态,依赖它的对象都会收到通知, 并自动更新(广播机制!!

核心代码---------------------主题类---加入,删除,通知观察者

/*
 * 主题类---加入,删除,通知观察者
 */
import java.util.ArrayList;

public class Subject {
	//定义一个集合存放,观察者对象
	private ArrayList<Observer> list = new ArrayList<Observer>();
	
	//注册新的观察者
	public void registerObserver(Observer observer){
		list.add(observer);
	}
	
	//删除观察者
	public void removeObserver(Observer observer){
		list.remove(observer);
	}
	
	//通知所有观察者,更新状态
	public void notifyAllObserver(){
		for (Observer observer : list) {
			observer.update(this);
		}
	}
}

11备忘录模式(Memento pattern): 保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态备忘录!

核心代码---------------------源发器类、备忘录类、负责人类

/* 
 * 源发器类 
 */  
public class Employee {  
    private String name;  
    private int age;  
    private double salary;  
      
    //进行备忘操作,并返回备忘录对象  
    public EmployeeMemento memento(){  
        return new EmployeeMemento(this);  
    }  
      
    //进行数据恢复,恢复成制定备忘录对象的值  
    public void recovery(EmployeeMemento e){  
        this.name = e.getName();  
        this.age = e.getAge();  
        this.salary = e.getSalary();  
    }  
      
    public Employee(String name, int age, double salary) {  
        super();  
        this.name = name;  
        this.age = age;  
        this.salary = salary;  
    }  
      
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
    public double getSalary() {  
        return salary;  
    }  
    public void setSalary(double salary) {  
        this.salary = salary;  
    }  
      
} 
/* 
 * 备忘录类 
 */  
public class EmployeeMemento {  
    private String name;  
    private int age;  
    private double salary;  
      
    public EmployeeMemento(Employee e) {  
        this.name = e.getName();  
        this.age = e.getAge();  
        this.salary = e.getSalary();  
    }  
      
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
    public double getSalary() {  
        return salary;  
    }  
    public void setSalary(double salary) {  
        this.salary = salary;  
    }  
      
}  
/* 
 * 负责人类,负责管理备忘录对象 
 */  
public class CareTaker {  
    private EmployeeMemento memento;  
  
    public EmployeeMemento getMemento() {  
        return memento;  
    }  
  
    public void setMemento(EmployeeMemento memento) {  
        this.memento = memento;  
    }  
      
} 

猜你喜欢

转载自blog.csdn.net/mmake1994/article/details/80556703