设计模式必须要弄明白的组合和继承
前言
哇,最近再看Java编程思想,看到了第七章复用类中7.5在组合和继承之间选择。让我对组合和继承有了新的认知,前一段时间把设计模式看完了,虽然说看了几遍,但是思想永远的记不住,理解不了。但是今天,结合着组合和继承让我有了新的认知,故想给学设计模式的同学一个我的理解思路。
组合和继承
理解组合和继承,实现,然后再组合和继承中做出选择
以下出自 Java编程思想
括号内是我自己的理解
组合和继承都允许在新的类中放置子对象,组合是显式的这样做,继承(,实现)是隐式的做。
组合技术通常用于想在新类中使用现在类的功能而并非他的接口这种情形,即,在新类中嵌入某个对象,让其实现所需的功能,但新类的用户看到的只是为新类定义的接口,而非所嵌入对象的接口。为取得此效果,需要在新类中嵌入一个现有类的private对象。
组合是一种has-a(有一个)的关系来表达。继承,实现是is-a(是一种)的关系来表达
我现在举一个设计模式的例子把,就简单的结构型模式,代理模式。
描述一下业务场景,你需要用google搜索,那么这时你就需要代理,才能FQ,进行goole搜素。
代码实现
抽象的用户类:
/**
* @InterfaceName Person
* @Description 抽象用户接口
* @Author ouyangkang
* @Date 2018-11-14 09:37
**/
public interface Person {
void login(ConcretePerson concreteperson);
void search();
}
具体的用户类:
/**
* @ClassName ConcretePerson
* @Description 具体用户 (抽象接口用户的具体实现) 解释:具体用户是一个用户
* @Author ouyangkang
* @Date 2018-11-14 09:37
**/
public class ConcretePerson implements Person {
private String userName;
private String userPC;
@Override
public void login(ConcretePerson concretePerson) {
System.out.printf("用户登陆信息 user=%s \n",concretePerson.toString());
}
@Override
public void search() {
System.out.println("开始搜素!!");
}
@Override
public String toString() {
return "ConcretePerson{" +
"userName='" + userName + '\'' +
", userPC='" + userPC + '\'' +
'}';
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setUserPC(String userPC) {
this.userPC = userPC;
}
}
代理类:
/**
* @ClassName Proxy
* @Description 代理对象 代理对象是一个用户,并且它还有一个用户 。这样是不是好理解多了
* @Author ouyangkang
* @Date 2018-11-14 09:39
**/
public class Proxy implements Person {
private Person person;
public Proxy(Person person) {
this.person = person;
}
//代理的接口
@Override
public void login(ConcretePerson concreteperson) {
System.out.println("加速服务");
this.person.login(concreteperson);
}
//代理的接口
@Override
public void search() {
System.out.println("开启代理。。 ");
this.person.search();
System.out.println("google 搜素结果如下。。。");
}
}
演示类:
/**
* @ClassName main
* @Description 演示
* @Author ouyangkang
* @Date 2018-11-14 09:45
**/
public class main {
public static void main(String[] args) {
ConcretePerson person = new ConcretePerson();
person.setUserName("ouyang");
person.setUserPC("oy-pc");
Person proxy = new Proxy(person);
proxy.login(person);
proxy.search();
}
}
结果如下:
加速服务
用户登陆信息 user=ConcretePerson{userName='ouyang', userPC='oy-pc'}
开启代理。。
开始搜素!!
google 搜素结果如下。。。