GOF23设计模式(七)

GOF设计模式之桥接(bridge)模式与组合模式(composite)

桥接(bridge)模式

桥接模式可以取代多层继承的方案。多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
桥接模式极大提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则,适合多维度开发。

接口以及实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface Brand {
void sale();
}
class Lenovo implements Brand{
@Override
public void sale() {
System.out.print("销售联想品牌");
}
}

class Dell implements Brand{
@Override
public void sale() {
System.out.print("销售戴尔品牌");
}
}

继承类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* 电脑类型
*/
public class Computer {
protected Brand brand;

public Computer(Brand brand) {
this.brand = brand;
}
public void sale() {
brand.sale();
}
}

class Desktop extends Computer{

public Desktop(Brand brand) {
super(brand);
}

@Override
public void sale() {
super.sale();
System.out.println("台式机");
}
}
class Laptop extends Computer{

public Laptop(Brand brand) {
super(brand);
}

@Override
public void sale() {
super.sale();
System.out.println("笔记本");
}
}

测设

1
2
3
4
5
6
7
8
9
10
public class Client {

public static void main(String[] args) {
//联想笔记本
Computer c=new Laptop(new Lenovo());
c.sale();
Computer c2=new Desktop(new Dell());
c2.sale();
}
}

结果

销售联想品牌笔记本
销售戴尔品牌台式机

组合模式(composite)

抽象构件(Component)角色:定义了叶子和容器构件的共同点。
叶子(Leaf)构件角色:无子节点。
容器(Composite)构件角色:有容器特征,可以包含子节点。

组合模式模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 模板
* 抽象组件
*/
public interface Component {
void operation();
}
//叶子组件
interface Leaf extends Component{
}
//容器组件
interface Composite extends Component{
void add(Component c);
void remove(Component c);
Component getChild(int index);
}

模拟杀毒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public interface AbstractFile {
void killVirus(); //杀毒
}

class ImageFile implements AbstractFile{
private String name;

public ImageFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("图像文件:"+name+",进行查杀");
}
}
class TextFile implements AbstractFile{
private String name;

public TextFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("文本文件:"+name+",进行查杀");
}
}
class VideoFile implements AbstractFile{
private String name;

public VideoFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("视频文件:"+name+",进行查杀");
}
}
class Folder implements AbstractFile{
private String name;
//定义容器,用来存放本容器构建下的子节点
private List<AbstractFile> list=new ArrayList<AbstractFile>();

public Folder(String name) {
this.name = name;
}
public void add(AbstractFile file) {
list.add(file);
}
public void remove(AbstractFile file) {
list.remove(file);
}
public AbstractFile getChild(int index) {
return list.get(index);
}
@Override
public void killVirus() {
System.out.println("文件夹:"+name+",进行查杀");
for(AbstractFile file : list) {
file.killVirus();
}
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Client {

public static void main(String[] args) {
AbstractFile f1,f2,f3,f4;
Folder f,ff;
f=new Folder("我的收藏");
f1=new ImageFile("图片.jpg");
f2=new TextFile("C.txt");
f.add(f1); f.add(f2);
ff=new Folder("电影");
f3=new VideoFile("的士速递.mp4");
f4=new VideoFile("鬼怪疑云.mp4");
ff.add(f3); ff.add(f4);
f.add(ff);
f.killVirus();
}
}

结果

文件夹:我的收藏,进行查杀
图像文件:图片.jpg,进行查杀
文本文件:C.txt,进行查杀
文件夹:电影,进行查杀
视频文件:的士速递.mp4,进行查杀
视频文件:鬼怪疑云.mp4,进行查杀

原创技术分享,您的支持将鼓励我继续创作
0%