デリゲートモード(デリゲートパターン):
基本的な役割は、プロキシモードと同じように、タスクと割り当てタスクのスケジューリングを担当し、総代理店の特別なケースでは、静的なプロキシとして見ることができますが、エージェントモデルは、プロセスに焦点を当てたという結果にモデル焦点を委任します。
それはgof23デザインパターンのいずれかに属していません。
行動パターンをビロング。
現実のシーン:
上司は、何かをするだけで管理者が対応する従業員に配布することができ、管理者への説明します
コード:
/**
* @Author Darker
* @Descrption 老板
* @Date : Created in 10:37 2020-3-12
*/
public class Boss {
//委派什么任务给经理
public void delegate(String task,Leader leader){
leader.doing(task);
}
}
/**
* @Author Darker
* @Descrption 被委派的经理,存储他统管的所有员工
* @Date : Created in 10:37 2020-3-12
*/
public class Leader {
//要知道每个员工的特长何特征
private Map<String,IEmployee> register = new HashMap<>();
public Leader(){
register.put("数据库",new Aemployee());
register.put("业务逻辑",new Bemployee());
}
//分配对应的任务给对应的员工
public void doing(String task){
register.get(task).doingSomeThings(task);
}
}
/**
* @Author Darker
* @Descrption 员工抽象
* @Date : Created in 10:38 2020-3-12
*/
public interface IEmployee {
public void doingSomeThings(String task);
}
/**
* @Author Darker
* @Descrption
* @Date : Created in 10:39 2020-3-12
*/
public class Aemployee implements IEmployee{
@Override
public void doingSomeThings(String task) {
System.out.println("我是a员工,我负责做数据库的工作,我做了"+task+"任务");
}
}
/**
* @Author Darker
* @Descrption
* @Date : Created in 10:40 2020-3-12
*/
public class Bemployee implements IEmployee{
@Override
public void doingSomeThings(String task) {
System.out.println("我是b员工,我负责做业务开发的工作,我做了"+task+"任务");
}
}
結果:
今の上司は、データベースの管理者にタスクを委任する必要があり、フィードバックを得ます
/**
* @Author Darker
* @Descrption
* @Date : Created in 10:57 2020-3-12
*/
public class DelegateTest {
public static void main(String[] args) {
new Boss().delegate("数据库",new Leader());
}
}
上司が需要に相当する場合の収入分析は、管理者は、すべての従業員を知っておく必要がありますし、各従業員は、すべての従業員のプライベートマップとタスクに対応するので、ボスクラスの配布作業を支援し、対応するタスクを維持するための管理者は、今そこにありますタスクは、あなたがすぐに対応する従業員に対応するタスクをスケジュールすることができたときに、このモデルは、帯電防止剤のようなビットです。
クラス間の関係:
質問があるので、どこに私たちはあなたが知っているだろう読んでコードを見て気にしない、コードの私たちの書き込みモードを委任するために使用されますです。
/**
* @Author Darker
* @Descrption 请求处理Servlet
* @Date : Created in 11:14 2020-3-12
*/
public class DispatcherServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
delegate(req,resp);
}
public void delegate(HttpServletRequest req, HttpServletResponse resp){
String reqUrl = req.getRequestURI();
if ("getOrderById".equals(reqUrl)){
new OrderController().getOrderById();
}else if("logout".equals(reqUrl)){
new SystemController().logout();
}else{
System.out.println("访问路径不存在 404");
}
}
}
/**
* @Author Darker
* @Descrption 订单业务Controller
* @Date : Created in 11:15 2020-3-12
*/
public class OrderController {
public void getOrderById(){
}
}
/**
* @Author Darker
* @Descrption 系统操作Controller
* @Date : Created in 11:28 2020-3-12
*/
public class SystemController {
public void logout(){
}
}
私は、我々は、ブラウザのアドレスにアクセスするために入力見つからない私たちは、あなたがに電話して呼び出される方法を決定したいサービスに派遣ヘルプをサーブレット、サーブレットの両方である、これはここでの戦略パターンではありません、私たちは、IS上記のコードを書きます単純な代入ロジック。
まあ、これは、デリゲートモデルであり、そしてそれは、比較的シンプルなデザインパターンですが、また、コードの最適化と組み合わせて、他のモードが重要な役割を果たしています。
彼は加えました:
少し荒い上記最終処理、私は春のソースは、いくつかのサプリメントをした思考のバネが書き込みを学んでいる参照してくださいので、ここでの改善されたコードです。
/**
* @Author Darker
* @Descrption 请求处理Servlet
* @Date : Created in 11:14 2020-3-12
*/
public class DispatcherServlet extends HttpServlet{
private List<Handler> handlerMapping = new ArrayList<>();
//初始化的时候把controller和访问路径,方法绑定在一个list里面
@Override
public void init() throws ServletException {
Class<?> orderControllerClass = OrderController.class;
try {
handlerMapping.add(new Handler()
.setController(orderControllerClass.newInstance())
.setMeThod(orderControllerClass.getMethod("getOrderById"))
.setUrl("/web/getMemberById.json")
);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
delegate(req,resp);
}
public void delegate(HttpServletRequest req, HttpServletResponse resp){
String reqUrl = req.getRequestURI();
Handler handler = null;
for(Handler h :handlerMapping){
if(reqUrl.equals(h.getUrl())){
handler = h;
break;
}
}
try {
Object o = handler.getMeThod().invoke(handler.getController(),null);
try {
resp.getWriter().write(o.toString());
} catch (IOException e) {
e.printStackTrace();
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
/* if ("getOrderById".equals(reqUrl)){
new OrderController().getOrderById();
}else if("logout".equals(reqUrl)){
new SystemController().logout();
}else{
System.out.println("访问路径不存在 404");
}*/
}
//绑定的类,模仿lombok的链式调用
class Handler{
private Object controller;
private Method meThod;
private String url;
public Object getController() {
return controller;
}
public Handler setController(Object controller) {
this.controller = controller;
return this;
}
public Method getMeThod() {
return meThod;
}
public Handler setMeThod(Method meThod) {
this.meThod = meThod;
return this;
}
public String getUrl() {
return url;
}
public Handler setUrl(String url) {
this.url = url;
return this;
}
}
}