java的艺术-设计模式

  1. 单例模式
    1. 饿汉模式
    2. 懒汉模式
    3. 内部类方式懒加载
    4. 枚举方式懒加载
    5. 双重校验锁懒加载
  2. 观察者模式
  3. 监听者模式

单例模式

饿汉模式

public class SingleClass1 {
    private SingleClass1(){}
    
    private static final SingleClass1 singleClass1 = new SingleClass1();
    
    public static SingleClass1 getInstance() {
        return singleClass1;
    }
}

懒汉模式


//线程不安全
public class SingleClass1 {
    private SingleClass1(){}

    private static SingleClass1 singleClass1;

    public static SingleClass1 getInstance() {
        if(singleClass1==null)
        {singleClass1 = new SingleClass1();}
        return SingleClass1.singleClass1;
    }
}

内部类方式懒加载


public class SingleClass1 {

    private SingleClass1() {
    }
     private static class InnerClass{
       private  static final SingleClass1 singleClass1 = new SingleClass1();
    }

    public static SingleClass1 getInstance() {

        return InnerClass.singleClass1;
    }
}

枚举方式懒加载


public class SingleClass1 {
    private SingleClass1() {
    }
    private enum InnerClass {
        /**
         *
         */
        INSTANCE;
        private final SingleClass1 singleClass1;
        /**枚举类型的构造器只会被实例化一次*/
        InnerClass() {
            singleClass1 = new SingleClass1();
        }
        SingleClass1 getInstance() {
            return singleClass1;
        }
    }
    public static SingleClass1 getInstance() {
        return InnerClass.INSTANCE.getInstance();
    }
}

双重校验锁懒加载

//effectivejava中提供的方式
public class SingleClass1 {
    private SingleClass1() {
    }
    //volatile 可以保证SingleClass1在初始化完成后再被加载
    private static volatile SingleClass1 singleClass1;
    
    public static SingleClass1 getInstance() {
        if (singleClass1 == null) {
            synchronized (SingleClass1.class) {
                if (singleClass1 == null) {
                    singleClass1 = new SingleClass1();
                }
            }
        }
        return SingleClass1.singleClass1;
    }
}

观察者模式

主体

public class Subject {
	ArrayList<Observer> list = new ArrayList<Observer>();

	public Subject() {
	}

	public Subject register(Observer observer) {
		list.add(observer);
		return this;
	}

	public Subject remove(Observer observer) {
		list.remove(observer);
		return this;
	}

	private void notifyToObserver() {
		if (!list.isEmpty()) {
			for (Observer o : list) {
				o.update();
			}
		}
	}

	public void working()
	{
		Optional.of("准备通知所有看着我的人 我获奖了").ifPresent(System.out::println);
		notifyToObserver();
	}

}

观察者

public interface Observer {
	void update();
}
class A implements Observer {
	@Override
	public void update() {
		Optional.of("A: 他能获奖?").ifPresent(System.out::println);
	}
	void  reg(Subject subject)
	{
		subject.register(this);
	}
}
class B implements Observer {
	@Override
	public void update() {
		Optional.of("B:我也想获奖").ifPresent(System.out::println);
	}
	void  reg(Subject subject)
	{
		subject.register(this);
	}
}

test

public class Test {
	public static void main(String[] args) {
		Subject subject = new Subject();
		new A().reg(subject);
		new B().reg(subject);
		subject.working();
	}
}

我们可以看到,我们的观察者A和B观察到主体获奖之后也发表了自己的感慨!。

监听者模式

个人认为 监听者和观察者最大的区别就是需要回调事件的方法 而观察者则调用观察者的方法。

首先我们提供一个监听器的集合来存储监听器,并提供监听器的注册方法,在要执行的具体方法时事件源注册给事件 再将事件注册给各个监听器,这时 ,监听器就可以触发所需的事件。

public class EventSource {
	//注册事件监听
	ArrayList<MyEventListenner> eventlist = new ArrayList<>();

	//报名 项目是否报名
	ArrayList<String> enlist = new ArrayList<>();


	EventSource registry(MyEventListenner eventListener) {
		eventlist.add(eventListener);
		return this;
	}


	//跑步项目
	void run() {
		//事件委托给监听器
		if (!eventlist.isEmpty()) {
			MyEvent event = new MyEvent(this);
			for (MyEventListenner e : eventlist)
				e.getevnsource(event);
		}
		Optional.of("我终于可以参加跑步比赛了").ifPresent(System.out::println);
	}

	//报名
	void enlist(String run) {
		enlist.add(run);
	}

	ArrayList<String> getenlist() {
		return enlist;
	}
}
public class MyEvent extends EventObject {

	public MyEvent(Object source) {
		super(source);
	}
	@Override
	public Object getSource() {
		return super.getSource();
	}

	public void isenlist()
	{
		//那个这个事件源判断他报没报名
		  if(!((EventSource)getSource()).getenlist().contains("run"))
			  Optional.of("兄弟你没报名啊").ifPresent(System.out::println);
	}
	public void isenlist1()
	{
		if(!((EventSource)getSource()).getenlist().contains("run"))
			Optional.of("兄弟赶紧报名啊").ifPresent(System.out::println);
	}
}
public abstract class MyEventListenner implements EventListener {
	public abstract void getevnsource(EventObject eventObject);
}
class MyEventListenner1 extends MyEventListenner {
	@Override
	public void getevnsource(EventObject eventObject) {
		((MyEvent)eventObject).isenlist();
	}
}
class MyEventListenner2 extends MyEventListenner {
	@Override
	public void getevnsource(EventObject eventObject) {
		((MyEvent)eventObject).isenlist1();
	}
}
public class Test1 {
	public static void main(String[] args) {
		EventSource eventSource = new EventSource();
		eventSource.registry(new MyEventListenner1()).registry(new MyEventListenner2()).run();
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		eventSource.enlist("run");
		eventSource.run();
	}
}