静态代理模式
静态代理模式由三部分组成:
1.共同实现的接口
2.被代理目标
3.代理
例子:鄙人结婚,需要找一个婚庆公司,帮助我布置婚礼现场等等。此时,我就是被代理对象,婚庆公司就是代理,而结婚就是被共同实现的接口。
package com.xzit.Demo02;
//静态代理模式总结:
//真实对象和代理对象都要实现同一个接口
//代理对象要代理真实角色
import com.xzit.chat.TalkRecieve;
//好处:
//代理对象可以做很多真实对象做不了的事情。
//真实对象专注做自己事情。
public class StaticProxy {
public static void main(String[] args) {
new Thread(()->System.out.println("我爱你")).start();
//new Weddingcompany(new You().HappyMarry());
You you = new You();
Weddingcompany 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 target;
public Weddingcompany(Marry target) {
this.target = target;
}
@Override
public void HappyMarry() {
before();
this.target.HappyMarry();//这就是真实对象
after();
}
private void before() {
System.out.println("结婚之前,布置现场");
}
private void after() {
System.out.println("结婚之后,收尾款");
}
}
静态代理模式总结:
> 真实对象和代理对象都要实现同一个接口
> 代理对象要代理真实角色
好处:
>代理对象可以做许多真实对象做不了的事情
>真实对象专注做自己的事
Lambda表达式
为什么使用Lamda表达式:
- 避免匿名内部类过多
- 可以让代码看起来更简洁
- 去掉一堆没有意义的代码,只留下核心的逻辑
函数式接口:
任何接口,如果只包含唯一一个抽象方法,那么他就是一个函数式接口。
对于函数式接口,我们可以通过lambda表达式来创建该接口的对象
推导Lambda表达式
package com.xzit.lamda;
/*
推导lambda表达式
*/
public class TestLambda {
//3.静态内部类
static class Like2 implements Ilike{
@Override
public void lambda() {
System.out.println("I like lambda2!");
}
}
public static void main(String[] args) {
Ilike like = new Like();//接口去new它一个实现类
like.lambda();
Like2 like2 = new Like2();
like2.lambda();
//4.局部内部类
class Like3 implements Ilike{
@Override
public void lambda() {
System.out.println("I like lambda3!");
}
}
Like3 like3 = new Like3();
like3.lambda();
//5.匿名内部类,没有类的名称必须借助接口或者父类
Ilike like4 = new Ilike(){
@Override
public void lambda() {
System.out.println("I like lambda4!");
}
};
like4.lambda();
//6.用lambda简化
like = () ->{
System.out.println("I like lambda5!");
};
like.lambda();
}
}
//1.定义一个函数式接口
interface Ilike{
void lambda();
}
//2.实现类
class Like implements Ilike{
@Override
public void lambda() {
System.out.println("I like lambda!");
}
}
Lambda表达式的简化:
package com.xzit.lamda;
public class Testlambda2 {
public static void main(String[] args) {
//1.lambda表达式简化
Ilove love = (int a) ->{
System.out.println("I love you->"+a);
};
//简化1.去掉参数类型
love = (a)->{
System.out.println("I love you->"+a);
};
//简化2.简化括号
love = a->{
System.out.println("I love you->"+a);
};
//简化3.去掉花括号
love = a->System.out.println("I love you->"+a);
//总结:
//lambda表达式只能由一行代码的情况下才能简化成为一行,如果有多行,那么就用代码块包裹。
//前提是接口为函数式接口
//多个参数类型也可以去掉参数类型,要去掉都去掉(必须加上括号)
love.love(521);
}
}
interface Ilove{
void love(int a);
}
Lambda表达式简化总结:
lambda表达式只能由一行代码的情况下才能简化成为一行,如果有多行,那么就用代码块包裹。
前提是接口为函数式接口
多个参数类型也可以去掉参数类型,要去掉都去掉(必须加上括号)