①设计模式:
- 真实角色
- 代理角色:持有真实角色的引用
- 二者实现相同的接口
-
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(); } }
总结