`

外观模式

 
阅读更多

        面向对象中通常将可以重复使用的工具类中的行为组织在一起形成最小的类。但是随着包的复用性使得子系统中类的多样性导致选择太多,这时可以使用外观(Facade)模式。一个个外观就是一个类,它包含的功能介于工具包与应用程序,它为子系统提供了一个接口,便于子系统使用它。它为子系统中的一组接口提供一个统一的高层接口。这一接口使得子系统更加容易使用。


                

 

Facade:这个外观类为子系统中Packages 1、2、3提供一个共同的对外接口。
Clients:客户对象通过一个外观接口读写子系统中各接口的数据资源。
Packages:客户可以通过外观接口读取的内部库。
/* Complex parts */
class CPU{
     public void freeze() { ... }
     public void jump(long position) { ... }
     public void execute() { ... }
}
class Memory{
     public void load(long position, byte[] data) {  ... }
}
class HardDrive {
     public byte[] read(long lba, int size) {  ...}
} 
/* Façade */
class Computer {
     public void startComputer() {
            cpu.freeze();
            memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
            cpu.jump(BOOT_ADDRESS);
            cpu.execute();
     }
}
/* Client */
class You {
     public static void main(String[] args) {
           Computer facade = new Computer();
           facade.startComputer();
      }
}
 
下面这个例子中,用来显示函数的轨迹,对于客户,只需要构造一个PlotPanel,然后将其加入frame中即可。而UI类就是一个外观类,它为客户提供了通过PlotPanel创建一个新的Panel的接口(这个新的panel不仅显示PlotPanel的内容,还有Border等)。
package mytest.function;

public abstract class Function {
    public abstract double f(double t);
}
 
package mytest.function;

public class T extends Function{
	@Override
	public double f(double t) {
		return t;
	}
}
这是包function中的函数接口。
package mytest.ui;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
import mytest.function.Function;

public class PlotPanel extends JPanel{
    private int count;  //点的个数
    private int[] xpoints;
    private int[] ypoints;
    private Function xf;  //用来计算坐标位置的函数
    private Function yf;
    
    public PlotPanel(int count,Function xf,Function yf){
    	this.count=count;
    	this.xf=xf;
    	this.yf=yf;
    	xpoints=new int[count];
    	ypoints=new int[count];
    	setBackground(Color.white);
    }
    @Override
    protected void paintComponent(Graphics g){
    	double w=getWidth()-1;
    	double h=getHeight()-1;
    	for(int i=0;i<count;i++){
    		double t=((double)i)/(count-1);
    		xpoints[i]=(int)(xf.f(t)*w);
    		ypoints[i]=(int)(h*(1-yf.f(t)));
    	}
    	g.drawPolyline(xpoints,ypoints,count);
    }
}
 接下来是通过PlotPanel创建新的Panel:
package mytest.ui;

import java.awt.Color;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.border.TitledBorder;

public class UI {
	public static final UI NORMAL=new UI();
	protected Font font=new Font("Book Antiqua",Font.PLAIN,18);
    public Font getFont(){
    	return font;
    }
    public TitledBorder createTitledBorder(String title){
    	TitledBorder border=BorderFactory.createTitledBorder(
    			BorderFactory.createBevelBorder(BevelBorder.RAISED),
    			title,TitledBorder.LEFT,TitledBorder.TOP);
    	border.setTitleColor(Color.black);
    	border.setTitleFont(getFont());
    	return border;
    }
    public JPanel createrTitledPanel(String title,JPanel in){
    	JPanel out=new JPanel();
    	out.add(in);
    	out.setBorder(createTitledBorder(title));
    	return out;
    }
}
 最后是客户使用UI类:
package mytest.test;

import java.awt.Dimension;
import javax.swing.JFrame;
import mytest.function.Function;
import mytest.function.T;
import mytest.ui.PlotPanel;
import mytest.ui.UI;

public class Show {
	public static void main(String[] args){
		PlotPanel p=new PlotPanel(101,new T(),new Show().new YFunction());
	    p.setPreferredSize(new Dimension(300,200));
	    JFrame frame=new JFrame("show a path");
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.getContentPane().add(UI.NORMAL.createrTitledPanel("Flight",p));
	    frame.pack();
	    frame.setVisible(true);
	}
	private class YFunction extends Function{
		@Override
		public double f(double t) {
			return 4*t*(1-t);
		}
	}
}
 结果:


 

       

  • 大小: 10.8 KB
  • 大小: 34.3 KB
分享到:
评论

相关推荐

    设计模式之外观模式案例代码

    **外观模式(Facade Pattern)**是一种结构型设计模式,它为复杂的系统或子系统提供一个简单的接口,使得客户端可以不关心内部的复杂性,只通过这个接口与子系统进行交互。这种模式降低了系统的复杂度,提高了代码的...

    设计模式之外观模式

    外观模式(Facade Pattern)是设计模式中的一种结构型模式,它的主要目的是为了解耦系统,提供一个统一的入口,使得客户端可以更容易地使用复杂的子系统。在Java中,外观模式通常用于简化对复杂系统的访问,它创建了...

    外观模式 Java实现 IDEA工程

    用外观模式实现下面这个抵押系统。 考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认: 1到银行子系统查询他是否有足够多的存款, 2到信用子系统查询他是否有良好的信用, 3到贷款子系统查询他有无...

    设计模式 - 外观模式(C++实例)

    **外观模式(Facade)**是一种结构型设计模式,它的主要目的是为了解耦复杂的系统,提供一个简单的接口,使得客户端可以更方便地使用系统的子系统。在C++编程中,外观模式的应用尤为常见,因为它能够有效地降低系统...

    设计模式-外观模式(讲解及其实现代码)

    **外观模式(Facade Pattern)**是一种结构型设计模式,它为复杂的系统或子系统提供一个简单的接口,使得客户端可以通过这个接口来访问系统,而无需了解系统内部的具体实现细节。外观模式降低了系统的复杂度,提高了...

    设计模式外观模式PPT学习教案.pptx

    设计模式外观模式PPT学习教案 在软件设计中,外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口来访问子系统中的多个接口,从而简化了子系统的使用和维护。本节课程将详细介绍外观模式的...

    设计模式--外观模式java例子

    **外观模式(Facade Pattern)**是软件设计模式中的一种结构型模式,它的主要目的是为了解耦复杂的系统,提供一个统一的接口,使得客户端可以更容易地使用这个系统。在Java编程中,外观模式的应用广泛,尤其是在处理...

    Android外观模式demo

    下面我们将详细探讨Android外观模式的概念、结构以及如何通过提供的"Android外观模式demo"进行实践。 外观模式的核心思想是提供一个统一的入口,隐藏系统的复杂性。在Android环境中,这通常意味着创建一个类,该类...

    外观模式.txt

    ### 外观模式详解 #### 一、外观模式概述 **外观模式**(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简单...

    C#设计模式-外观模式

    **外观模式(Facade Pattern)**是软件工程中一种常用的设计模式,它为复杂的子系统提供了一个简单的接口,使得客户端代码可以更容易地与这些子系统交互。在C#中,外观模式同样被广泛应用,以降低系统的复杂性,提高...

    设计模式之适配器模式与外观模式demo

    适配器模式和外观模式是两种非常重要的设计模式,它们在实际项目中有着广泛的应用。本资源提供了一个关于这两种模式的实战示例,帮助我们更好地理解和应用它们。 适配器模式(Adapter Pattern)的主要目的是将两个...

    设计模式之外观模式(Facade Pattern)

    **外观模式(Facade Pattern)**是一种结构型设计模式,它主要解决的是复杂系统或子系统对外暴露一个简单统一的接口,使得客户端无需关心内部复杂的交互细节。这种模式在实际开发中广泛应用,尤其在大型项目中,它能...

    实验7 适配器模式、外观模式与模板方法模式

    ### 实验7 适配器模式、外观模式与模板方法模式 #### 一、适配器模式 **适配器模式(Adapter Pattern)** 是一种结构型设计模式,它允许不兼容的接口之间能够协同工作。适配器模式的主要作用是通过创建一个新的...

    java设计模式之外观模式

    **外观模式(Facade Pattern)**是软件设计模式中的一种结构型模式,它的主要目的是为了解耦复杂的系统,提供一个统一的接口,使得客户端可以更容易地使用这个系统。在这个模式中,外观类作为客户端与子系统之间的...

    外观模式 - 代码(Java)

    **外观模式(Facade Pattern)**是一种结构型设计模式,它为复杂的系统或子系统提供一个统一的入口点,简化了客户端与其交互的方式。在Java中,外观模式的应用可以帮助我们更好地组织代码,降低系统的耦合度,并提高...

    装饰、外观模式实例代码

    装饰模式和外观模式是软件设计模式中的两种重要结构模式,它们在实际开发中有着广泛的应用。下面我们将分别探讨这两种模式的原理、应用场景以及实例代码。 首先,装饰模式(Decorator Pattern)是一种行为设计模式...

    外观模式示例源代码

    外观模式(Facade Pattern)是一种设计模式,它提供了一个统一的接口,用来访问子系统中的一组接口。这种模式使得客户端可以更容易地使用一个复杂的子系统,而无需了解其内部细节。在C#中,我们可以利用面向对象编程...

    外观模式案例(基础案例)

    某系统需要提供一个文件加密模块,加密流程包括三...现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块。

    外观模式的示例

    考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信用,到贷款子系统查询他有无贷款... 未采用外观模式的类结构图见附件。

    外观模式习题4.zip

    外观模式是面向对象设计模式的一种,它的主要目标是提供一个统一的接口,用于与复杂的子系统进行交互,简化客户端代码,使得客户类无需了解子系统内部的复杂性。 首先,让我们深入理解外观模式的核心概念。外观模式...

Global site tag (gtag.js) - Google Analytics