基础类(父类)的设计, 一定要有普遍性
适配器模式:
定义
将一个接口转换为客户端所期待的接口,从而使两个接口不兼容的类可以在一起工作 适配器模式还有个别名叫: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(监听器对象)