interface Mary{
void mary() ;
}
//每一个人都需要结婚
//真实角色
class You implements Mary{
@Override
public void mary() {
System.out.println("要结婚了很开心...");
}
}
//代理角色---->婚庆公司
class WeddingCompany implements Mary{
//声明接口
private Mary mary ;
//有一个有参构造方法
public WeddingCompany(Mary mary){ //需要接口子实现类 You
this.mary = mary ;
}
@Override
public void mary() {
System.out.println("结婚之前,混穷公司布置婚礼现场!");
if(mary!=null){
mary.mary(); //核心的方法(真实角色要实现自己的事情)
}
System.out.println("婚礼现场完成之后,给婚庆公司付尾款!");
}
}
//测试类
public class StaticProxyDemo {
public static void main(String[] args) {
//创建You类对象(多态/自己new 自己)
You you = new You() ;
you.mary();
System.out.println("------------------使用静态代理-------------------------");
//创建资源类对---->真实角色
You you2 = new You() ;
//创建代理角色---->婚庆公司
WeddingCompany wc = new WeddingCompany(you2) ;
wc.mary();
}
}
电影院买票方式一代码实现
//继承关系
public class SellTicketThread extends Thread{
//100张票
private static int tickets = 100 ;
//t1,t2,t3都要并发执行
@Override
public void run() {
//模拟一直有票
while (true){
//模拟真实场景,线程睡眠
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//如果tickets>0
if(tickets>0){
System.out.println(getName()+"正在出售第"+(tickets--)+"张票");
}
}
}
}
//测试类
public class SellTicketTest {
public static void main(String[] args) {
//创建三个线程类对象
SellTicketThread st1 = new SellTicketThread() ;
SellTicketThread st2 = new SellTicketThread() ;
SellTicketThread st3 = new SellTicketThread() ;
//线程名称
st1.setName("窗口1") ;
st2.setName("窗口2") ;
st3.setName("窗口3") ;
//启动线程
st1.start();
st2.start();
st3.start();
}
}
方式2实现电影院卖票
/* 方式2实现
当加入延迟效果,可能出现
1)同票出现 --------------->线程的执行的过程---原子性操作!(针对最简单,最基本的操作++,--)
2)可能出现负票!
线程不安全!*/
//真实角色
public class SellTicket implements Runnable {
//100张票
private static int tickets = 100 ;
@Override
public void run() {
//模拟一直有票
while (true){
//t1,t2,,t3
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(tickets>0){
System.out.println(Thread.currentThread().getName()+"正在出售第"+(tickets--)+"张票");
}/*else{
break;
}*/
}
/**
* 出现同票/负票--->线程不安全!
* 变量-- ---->原子性操作(线程的执行具有随机性)
* 1) 窗口1进来了 记录原始值---100 ---->100-1 =99
* 2)窗口3进来了 在打印99的时候,同时窗口2也进来了,也直接使用这个原始值 99,然后--
*/
}
}
public class SellTicketTest {
public static void main(String[] args) {
//创建资源类对象:真实角色
SellTicket st = new SellTicket() ;
//创建三个线程,代表三个窗口
Thread t1 = new Thread(st,"窗口1") ;
Thread t2 = new Thread(st,"窗口2") ;
Thread t3 = new Thread(st,"窗口3") ;
//启动线程
t1.start() ;
t2.start() ;
t3.start() ;
}
}