package com.chengguo.線程; /** * 靜態代理設計模式: * ①真實角色 * ②代理角色:持有真實角色的引用 * ③兩者實現相同接口 */ public class Demo_20200509005_StaticProxy { public static void main(String[] args) { // WeddingCompany wc = new WeddingCompany(new You()); // wc.HappyMarry(); //建立真實角色(可使用接口) Marry you = new You(); //建立代理角色(可使用接口),加入真實角色的引用 Marry weddingCompany = new WeddingCompany(you); //執行 weddingCompany.HappyMarry(); } } //③兩者實現相同接口 interface Marry { //久旱逢甘露 //他鄉遇故知 //洞房花燭夜 //金榜題名時 void HappyMarry(); } //①真實角色 class You implements Marry { //重寫接口方法 @Override public void HappyMarry() { System.out.println("新郎官結婚咯"); } } //②代理角色 class WeddingCompany implements Marry { private Marry you; //無參構造 public WeddingCompany() { } //帶參構造 public WeddingCompany(Marry you) { this.you = you; } //重寫接口方法 @Override public void HappyMarry() { before(); this.you.HappyMarry(); after(); } //結婚以後 private void after() { System.out.println("結婚以後--->收尾款"); } //結婚以前 private void before() { System.out.println("結婚以前--->佈置現場"); } }
靜態代理+線程模擬12306搶票實現設計模式
package com.chengguo.線程; /** * 多個線程同時操做同一個對象:買火車票的例子 */ public class Demo_20200509002_Thread implements Runnable { //定義火車票默認張數 private int ticketNums = 10; @Override public void run() { while (true) { if (ticketNums <= 0) { break; } else { try { //模擬延時 Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } //獲取當前票的名字:Thread.currentThread().getName();每搶一張票就-- System.out.println(Thread.currentThread().getName() + "搶到了第" + ticketNums-- + "張票"); } } } public static void main(String[] args) { //建立runnable接口的實現類對象(真實角色) Demo_20200509002_Thread dt1 = new Demo_20200509002_Thread(); //建立一個線程對象,經過線程對象來開啓線程(代理角色:持有真實角色的引用) // Thread thread1 = new Thread(dt1, "路人甲"); // thread1.start(); // Thread thread2 = new Thread(dt1, "路人乙"); // thread2.start(); // Thread thread3 = new Thread(dt1, "路人丙"); // thread3.start(); // 優化代碼 new Thread(dt1, "路人甲").start(); new Thread(dt1, "路人乙").start(); new Thread(dt1, "路人丙").start(); } }
總結app