基础类(父类)的设计, 一定要有普遍性

适配器模式

定义

将一个接口转换为客户端所期待的接口,从而使两个接口不兼容的类可以在一起工作 适配器模式还有个别名叫:Wrapper(包装器),顾名思义就是将目标类用一个新类包装一下,相当于在客户端与目标类直接加了一层。IT世界有句俗语:没有什么问题是加一层不能解决的

使用场景

  • 当需要使用一个现存的类,但它提供的接口与我们系统的接口不兼容,而我们还不能修改它时
  • 当多个团队独立开发系统的各功能模块,然后组合在一起,但由于某些原因事先不能确定接口时。(别和我说这不可能,这太tm可能了)

三个角色

  • Target: 一个接口, 客户端原本自带的接口
  • Adaptee: 想要使用的另一个接口, 且与Target不兼容
  • Adapter: 适配器类, 实现Target并且在里面引用Adaptee, 包装其功能

实例

1 原接口

interface LogFactory {  
    void debug(String tag, String message);  
}

2 目标接口与实现

interface NbLogger {  
    void d(int priority, String message, Object ... obj);  
}
class NbLoggerImp implements NbLogger {  
    @Override  
    public void d(int priority, String message, Object...obj) {  
        System.out.printf("测试NbLogger记录:%s%n",message);  
    }  
}

3 适配器类实现

public class Adapter implements LogFactory{  
    private NbLogger nbLogger;  // 要使用的接口的实现类
 
    public Adapter(NbLogger nbLogger) {  // 实现类
        this.nbLogger = nbLogger;  
    }  
  
    @Override  
    public void debug(String tag, String message) {  
        Objects.requireNonNull(nbLogger);  
        nbLogger.d(1,message);  // 调用
    }  
}

4 测试

 public static void main(String[] args) {  
        LogFactory logFactory = new Adapter(new NbLoggerImp());  
        logFactory.debug("test","我使用nbLogger打印log");  
    }  

第一个登录框

  • java.awt.*
  • javax.swing.*

目标

  • 一个窗口 Frame
  • 包含两个标签Lable
    • 用户 login
    • 密码 password
  • 两个输入框 textFiled
    • 用户名 LoginTextFiled
    • 密码 PasswordTextFiled
  • 两个按钮
    • 登录 LoginBotton
    • 取消 CancelBotton

实现代码

package ex001;  
import java.awt.*;  
import javax.swing.*;  
  
public class LoginFrame {  
    private JFrame jFrame;  
    private JLabel jlbname,jlbpwd;  
    private JTextField jtflogin;  
    private JPasswordField jtfpwd;  
    private JButton jblogin, jbcancel;  
    private JPanel jp1,jp2,jp3;  
    private Container c;  
  
    public LoginFrame() {  
        jFrame = new JFrame("登录");  
        jlbname = new JLabel("用户名:");  
        jlbpwd = new JLabel(" 密  码:");  
        jtflogin = new JTextField(14);  
        jtfpwd = new JPasswordField(14);  
        jblogin = new JButton("登录");  
        jbcancel = new JButton("取消");  
        jp1 = new JPanel(); jp2 = new JPanel(); jp3 = new JPanel();  
		  // 创建contain
        c = jFrame.getContentPane();  
  
        jp1.add(jlbname);  
        jp1.add(jtflogin);  
  
        jp2.add(jlbpwd);  
        jp2.add(jtfpwd);  
  
        jp3.add(jblogin);  
        jp3.add(jbcancel);  
  
        jFrame.add(jp1,BorderLayout.NORTH);  
        jFrame.add(jp2, BorderLayout.CENTER);  
        jFrame.add(jp3,BorderLayout.SOUTH);  
  
        jFrame.pack();  
        //jFrame.setSize(500,300);  
        setCenterFrame(jFrame);  
        jFrame.setVisible(true);  
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  
    }  
  
    public void setCenterFrame(JFrame jFrame) {  
        Toolkit t1 = Toolkit.getDefaultToolkit();  
        int sw, sh, fw, fh;  
        sw = (int)t1.getScreenSize().getWidth();  
        sh = (int)t1.getScreenSize().getHeight();  
        fw = jFrame.getWidth();  
        fh = jFrame.getHeight();  
  
        jFrame.setLocation((sw-fw)/2, (sh-fh)/2);  
    }  
}

新建一个包来放配置

组件.addxxxLIstener(监听器对象)