概述
一、外观模式
定义:为子系统中一组接口提供一致的界面,此模式定义了一个高层接口,该接口使得子系统更加容易使用。
使用场景:一、在软件设计初级阶段,应该有意识的将软件两个层分开,比如经典的三层架构,降低了耦合。二、开发阶段,层与层之间的耦合愈来愈复杂,增加外观(facade)可以提供一个简单的接口,降低依赖。三、在维护大型系统时,系统难以扩展和维护,为新系统开发一个外观类,设计比较粗超或者高度复杂的遗留代码的比较清晰的简单接口,让新系统与facade交互,facade与遗留代码交互所有复杂的工作。
实例
略
二、组合模式
定义:将对象组合成树形结构以表示‘部分-整体’的层次结构组合模式使得用户对单个对象和组合对象的使用具有一致性。
示意图:
使用场景:当发现需求体现的是部分和整体层次结构时,希望用户忽略组合对象和单个对象的不同,统一的使用组合结构中所有对象时,就应该考虑使用组合模式。
实例:
接口
package com.softline.composite;
public interface IAntivirus {
public void killVirus();
}
实现
package com.softline.composite;
public class AntivirusImage implements IAntivirus{
private String name;
public AntivirusImage(String name){
this.name = name;
}
@Override
public void killVirus() {
// TODO Auto-generated method stub
System.out.println("对图片"+name+"进行扫描杀毒!");
}
}
package com.softline.composite;
public class AntivirusText implements IAntivirus {
private String name;
public AntivirusText(String name){
this.name = name;
}
@Override
public void killVirus() {
// TODO Auto-generated method stub
System.out.println("对文本"+name+"进行扫描杀毒!");
}
}
package com.softline.composite;
import java.util.ArrayList;
import java.util.List;
public class AntivirusFile implements IAntivirus {
private String name;
public AntivirusFile(String name){
this.name = name;
}
public List<IAntivirus> list = new ArrayList<IAntivirus>();
public void add(IAntivirus antivirus){
list.add(antivirus);
}
public void remove(IAntivirus antivirus){
list.remove(antivirus);
}
@Override
public void killVirus() {
// TODO Auto-generated method stub
System.out.println("对文件"+name+"进行扫描杀毒!");
for(IAntivirus antivirus:list){
antivirus.killVirus();
}
}
}
客户端
package com.softline.composite;
public class Client {
public static void main(String[] args) {
IAntivirus file1,file2;
file1 = new AntivirusImage("image.jpg");
file2 = new AntivirusText("text.txt");
AntivirusFile file3 = new AntivirusFile("file");
file3.add(file1);
file3.add(file2);
file3.killVirus();
}
}
window:
对文件file进行扫描杀毒!
对图片image.jpg进行扫描杀毒!
对文本text.txt进行扫描杀毒!
二、装饰模式
定义:动态的给一个对象添加一些额外的职责,就增加功能来说装饰模式比生成子类更加灵活。
使用场景:装饰者模式是为已有的功能添加更多功能的一种方式,当系统需要新的功能的时候是想就得类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为。这些新加的东西仅仅是为了满足一些只在特定情况下才会执行的类,并让这个类包装他所需要的对象。因此,当需要执行特殊行为时,客户代码就可以在运行时更具需要有选择的、按顺序的使用装饰功能包装对象了。
示意图:
实例:
食物,接口、实现类
package com.softline.decorator;
public interface IFood {
public void getFood();
}
package com.softline.decorator;
public class Chicken implements IFood {
private String dec = "鸡肉";
@Override
public void getFood() {
// TODO Auto-generated method stub
System.out.println(dec);
}
}
装饰抽象类、实现类
package com.softline.decorator;
public abstract class Decorator implements IFood {
@Override
public abstract void getFood();
public abstract void cookFood();
}
package com.softline.decorator;
public class Roast extends Decorator {
private IFood food;
public Roast(IFood food){
this.food=food;
}
@Override
public void getFood() {
// TODO Auto-generated method stub
cookFood();
food.getFood();
}
@Override
public void cookFood() {
// TODO Auto-generated method stub
System.out.print("烤");
}
}
package com.softline.decorator;
public class Braise extends Decorator {
private IFood food;
public Braise(IFood food){
this.food = food;
}
@Override
public void getFood() {
// TODO Auto-generated method stub
cookFood();
food.getFood();
}
@Override
public void cookFood() {
// TODO Auto-generated method stub
System.out.print("蒸");
}
}
客户端
package com.softline.decorator;
public class Client {
public static void main(String[] args) {
IFood chicken = new Chicken();
chicken.getFood();
IFood roast = new Roast(chicken);
IFood braise = new Braise(chicken);
roast.getFood();
braise.getFood();
}
}
window:
鸡肉
烤鸡肉
蒸鸡肉
三、享元模式
定义:运用共享技术有效的支持大量细粒度的对象。
使用场景:享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类和实例来生成数据。如果发现这些实例除了几个参数外基本都是相同的,有时就能减少需要实例化类的数量。如果能够把这些参数移动到类实例的外面,在方法调用时传递进来,就可以通过共享大幅度的减少实例的数目。
示意图:
实例:
围棋接口、坐标、实现类
package com.softline.flyweight;
public interface IStone {
public void getColor();
public Location getLocation();
public void setLocation(Location location);
}
package com.softline.flyweight;
public class Location {
private String x = "x";
private String y = "y";
@Override
public String toString() {
return "Location [x=" + x + ", y=" + y + "]";
}
}
package com.softline.flyweight;
public class StoneImpl implements IStone {
private String color;
private Location location;
public StoneImpl(String color){
this.color=color;
}
@Override
public void getColor() {
// TODO Auto-generated method stub
System.out.println("棋子的颜色是:"+color);
}
public Location getLocation() {
return location;
}
public void setLocation(Location location) {
this.location = location;
}
}
围棋静态工厂类:
package com.softline.flyweight;
import java.util.HashMap;
import java.util.Map;
public class StoneFactory {
private static Map<String,IStone> map = new HashMap<String,IStone>();
public static IStone getStone(String color){
if(map.containsKey(color)){
return map.get(color);
}else{
IStone stone = new StoneImpl(color);
map.put(color, stone);
return stone;
}
}
}
客户端:
package com.softline.flyweight;
public class Client {
public static void main(String[] args) {
IStone stone1 = StoneFactory.getStone("黑色");
IStone stone2 = StoneFactory.getStone("黑色");
System.out.println(stone1);
System.out.println(stone2);
stone1.setLocation(new Location());
System.out.println(stone2.getLocation().toString());
}
}
windows:
com.softline.flyweight.StoneImpl@15db9742
com.softline.flyweight.StoneImpl@15db9742
Location [x=x, y=y]
最后
以上就是愉快银耳汤为你收集整理的java设计模式之——外观模式、组合模式、装饰模式、享元模式(结构型)一、外观模式二、组合模式二、装饰模式三、享元模式的全部内容,希望文章能够帮你解决java设计模式之——外观模式、组合模式、装饰模式、享元模式(结构型)一、外观模式二、组合模式二、装饰模式三、享元模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复