面向对象:
面向对象系统追求的目标就是尽可能地提高系统模块内部的内聚(Cohesion)、尽可能降低模块间的耦合(Coupling) 。然而这也是面向对象设计过程中最难把握的部分。
GOF在提出Bridge模式的时候指出:Bridge模式的用意是“将 抽象化(Abstraction) 与 实现化(Implementation) 脱耦,使得二者可以独立地变化”。
脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。
using System;
namespace 桥接模式
{
abstract class Implementor
{
public abstract void Operation();
}
class ConcreteImplementorA:Implementor
{
public override void Operation()
{
Console.WriteLine("具体实现A的方法执行");
}
}
class ConcreteImplementorB:Implementor
{
public override void Operation()
{
Console.WriteLine("具体实现B的方法执行");
}
}
class Abstraction
{
protected Implementor implementor;
public void SetImplementor(Implementor implementor)
{
this.implementor = implementor;
}
public virtual void Operation()
{
implementor.Operation();
}
}
class RefinedAbstraction:Abstraction
{
public override void Operation()
{
implementor.Operation();
}
}
class Program
{
static void Main(string[] args)
{
Abstraction ab = new RefinedAbstraction();
ab.SetImplementor(new ConcreteImplementorA());
ab.Operation();
ab.SetImplementor(new ConcreteImplementorB());
ab.Operation();
Console.Read();
}
}
}
分离抽象和实现
ps:仅代表个人思路
【问题】
考虑这样一个实际的业务功能:发送提示消息。
现在要实现这样的发送提示消息的功能,该如何实现呢?
【代码】
public class MyAuthenticator extends Authenticator {
private String userName=null;
private String password=null;
public MyAuthenticator(){}
public MyAuthenticator(String username, String password) {
this.userName = username;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(userName, password);
}
}
public abstract class AbstractMessage {
protected MessageImplementor impl;
public AbstractMessage(MessageImplementor impl) {
super();
this.impl = impl;
}
public void sendMessage(String message,String toUser) {
this.impl.send(message, toUser);
}
}
public class CommonMessage extends AbstractMessage {
public CommonMessage(MessageImplementor impl) {
super(impl);
}
public void sendMessage(String message,String toUser) {
super.sendMessage(message, toUser);
}
}
public class UrgencyMessage extends AbstractMessage {
public UrgencyMessage(MessageImplementor impl) {
super(impl);
}
public void sendMessage(String message,String toUser) {
message="加急:"+message;
super.sendMessage(message, toUser);
}
public Object watch(String messageld) {
return null;
}
}
public class SpecialUrgencyMessage extends AbstractMessage {
public SpecialUrgencyMessage(MessageImplementor impl) {
super(impl);
}
public void sendMessage(String message,String toUser) {
message="特急:"+message;
super.sendMessage(message, toUser);
}
public void hurry(String messageld) {
}
}
public interface MessageImplementor {
public void send(String message,String toUser);
}
public class MessageSMS implements MessageImplementor {
@Override
public void send(String message, String toUser) {
System.out.println("使用站内短消息的方式,发送消息:"+message+"给"+toUser);
}
}
public class MessageMobile implements MessageImplementor {
@Override
public void send(String message, String toUser) {
System.out.println("使用手机短消息的方式,发送消息:"+message+"给"+toUser);
}
}
public class MessageEmail implements MessageImplementor {
@Override
public void send(String message, String toUser) {
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com"); //smtp服务器地址
props.put("mail.smtp.auth", true); //是否需要认证
MyAuthenticator myauth = new MyAuthenticator("[email protected]","********");
Session session = Session.getInstance(props,myauth);
session.setDebug(true); //打开debug功能
Message msg = new MimeMessage(session);
try {
msg.setFrom(new InternetAddress("[email protected]"));//设置发件人
msg.setText(message); //设置邮件内容
msg.setSubject(message); //设置邮件主题
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(toUser));
Transport.send(msg);
} catch(AddressException e) {
System.out.println("地址错误!");
e.printStackTrace();
} catch(MessagingException e) {
System.out.println("信息错误!");
e.printStackTrace();
}
}
}
public class Client {
public static void main(String[] args) {
MessageImplementor impl =new MessageSMS();
AbstractMessage m=new CommonMessage(impl);
m.sendMessage("请喝一杯茶", "[email protected]");
m=new UrgencyMessage(impl);
m.sendMessage("请喝一杯茶", "[email protected]");
m=new SpecialUrgencyMessage(impl);
m.sendMessage("请喝一杯茶", "[email protected]");
impl=new MessageMobile();
m=new CommonMessage(impl);
m.sendMessage("请喝一杯茶", "[email protected]");
m=new UrgencyMessage(impl);
m.sendMessage("请喝一杯茶", "[email protected]");
m=new SpecialUrgencyMessage(impl);
m.sendMessage("请喝一杯茶", "[email protected]");
impl=new MessageEmail();
m=new CommonMessage(impl);
m.sendMessage("请喝一杯茶", "[email protected]");
m=new UrgencyMessage(impl);
m.sendMessage("请喝一杯茶", "[email protected]");
m=new SpecialUrgencyMessage(impl);
m.sendMessage("请喝一杯茶", "[email protected]");
}
}