You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/06/28 12:25:00 UTC

[shardingsphere] branch master updated: Refactor UniqueRuleItemChangedEventCreator and NamedRuleItemChangedEventCreator (#26655)

This is an automated email from the ASF dual-hosted git repository.

jianglongtao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new c8f8098e55b Refactor UniqueRuleItemChangedEventCreator and NamedRuleItemChangedEventCreator (#26655)
c8f8098e55b is described below

commit c8f8098e55b984a8ca727f3586650c5a399ea05c
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Wed Jun 28 20:24:52 2023 +0800

    Refactor UniqueRuleItemChangedEventCreator and NamedRuleItemChangedEventCreator (#26655)
    
    * Refactor ShardingRuleChangedEventCreator
    
    * Refactor UniqueRuleItemChangedEventCreator and NamedRuleItemChangedEventCreator
---
 .../event/BroadcastRuleChangedEventCreator.java    |  24 +--
 .../BroadcastTableEventCreator.java}               |  29 +--
 .../CompatibleEncryptRuleChangedEventCreator.java  |  34 +---
 .../event/EncryptRuleChangedEventCreator.java      |  34 +---
 .../CompatibleEncryptorEventCreator.java}          |  27 ++-
 .../table/CompatibleEncryptTableEventCreator.java  |  40 +++++
 .../event/encryptor/EncryptorEventCreator.java}    |  27 ++-
 .../event/table/EncryptTableEventCreator.java      |  40 +++++
 .../mask/event/MaskRuleChangedEventCreator.java    |  34 +---
 .../mask/event/algorithm/MaskEventCreator.java}    |  27 ++-
 .../mask/event/table/MaskTableCreator.java}        |  30 ++--
 .../ReadwriteSplittingRuleChangedEventCreator.java |  34 +---
 .../ReadwriteSplittingDataSourceEventCreator.java  |  40 +++++
 ...lanceEvent.java => AlterLoadBalancerEvent.java} |   4 +-
 ...anceEvent.java => DeleteLoadBalancerEvent.java} |   4 +-
 ...eadwriteSplittingLoadBalancerEventCreator.java} |  25 ++-
 .../ReadwriteSplittingLoadBalanceSubscriber.java   |   8 +-
 .../event/ShadowRuleChangedEventCreator.java       |  73 +++-----
 .../DefaultShadowAlgorithmEventCreator.java}       |  27 ++-
 .../algorithm/ShadowAlgorithmEventCreator.java}    |  27 ++-
 .../datasource/ShadowDataSourceEventCreator.java   |  40 +++++
 .../event/table/ShadowTableEventCreator.java       |  40 +++++
 .../event/ShardingRuleChangedEventCreator.java     | 195 ++++-----------------
 .../algorithm/auditor/AuditEventCreator.java}      |  27 ++-
 .../keygenerator/KeyGeneratorEventCreator.java}    |  27 ++-
 .../sharding/ShardingAlgorithmEventCreator.java}   |  27 ++-
 .../event/cache/ShardingCacheEventCreator.java     |  40 +++++
 .../audit/ShardingAuditorStrategyEventCreator.java |  40 +++++
 .../DatabaseShardingStrategyEventCreator.java      |  40 +++++
 .../KeyGenerateStrategyEventCreator.java           |  40 +++++
 .../DefaultShardingColumnEventCreator.java         |  40 +++++
 .../table/TableShardingStrategyEventCreator.java   |  40 +++++
 .../table/auto/ShardingAutoTableEventCreator.java  |  40 +++++
 .../ShardingTableReferenceEventCreator.java        |  40 +++++
 .../table/sharding/ShardingTableEventCreator.java  |  40 +++++
 .../event/SingleRuleChangedEventCreator.java       |  24 +--
 .../SingleTableEventCreator.java}                  |  29 +--
 .../event/NamedRuleItemChangedEventCreator.java    |  26 ++-
 .../event/UniqueRuleItemChangedEventCreator.java   |  21 +--
 39 files changed, 842 insertions(+), 562 deletions(-)

diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleChangedEventCreator.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleChangedEventCreator.java
index 567113bf8fd..c40e16777af 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleChangedEventCreator.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleChangedEventCreator.java
@@ -17,13 +17,11 @@
 
 package org.apache.shardingsphere.broadcast.event;
 
-import org.apache.shardingsphere.broadcast.event.config.AddBroadcastTableEvent;
-import org.apache.shardingsphere.broadcast.event.config.AlterBroadcastTableEvent;
-import org.apache.shardingsphere.broadcast.event.config.DeleteBroadcastTableEvent;
+import org.apache.shardingsphere.broadcast.event.config.BroadcastTableEventCreator;
 import org.apache.shardingsphere.broadcast.metadata.nodepath.BroadcastRuleNodePathProvider;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
 import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
 
 /**
@@ -31,27 +29,21 @@ import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
  */
 public final class BroadcastRuleChangedEventCreator implements RuleChangedEventCreator {
     
-    @SuppressWarnings("SwitchStatementWithTooFewBranches")
     @Override
     public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType) {
+        return getUniqueRuleItemChangedEventCreator(itemType).create(databaseName, event);
+    }
+    
+    @SuppressWarnings("SwitchStatementWithTooFewBranches")
+    private UniqueRuleItemChangedEventCreator getUniqueRuleItemChangedEventCreator(final String itemType) {
         switch (itemType) {
             case BroadcastRuleNodePathProvider.TABLES:
-                return createTableEvent(databaseName, event);
+                return new BroadcastTableEventCreator();
             default:
                 throw new UnsupportedOperationException(itemType);
         }
     }
     
-    private GovernanceEvent createTableEvent(final String databaseName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddBroadcastTableEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterBroadcastTableEvent(databaseName, event.getKey(), event.getValue());
-        }
-        return new DeleteBroadcastTableEvent(databaseName);
-    }
-    
     @Override
     public String getType() {
         return "broadcast";
diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleChangedEventCreator.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/BroadcastTableEventCreator.java
similarity index 56%
copy from features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleChangedEventCreator.java
copy to features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/BroadcastTableEventCreator.java
index 567113bf8fd..ff4e7492f27 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleChangedEventCreator.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/BroadcastTableEventCreator.java
@@ -15,34 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.broadcast.event;
+package org.apache.shardingsphere.broadcast.event.config;
 
-import org.apache.shardingsphere.broadcast.event.config.AddBroadcastTableEvent;
-import org.apache.shardingsphere.broadcast.event.config.AlterBroadcastTableEvent;
-import org.apache.shardingsphere.broadcast.event.config.DeleteBroadcastTableEvent;
-import org.apache.shardingsphere.broadcast.metadata.nodepath.BroadcastRuleNodePathProvider;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
-import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
 
 /**
- * Broadcast rule changed event creator.
+ * Broadcast table event creator.
  */
-public final class BroadcastRuleChangedEventCreator implements RuleChangedEventCreator {
+public final class BroadcastTableEventCreator implements UniqueRuleItemChangedEventCreator {
     
-    @SuppressWarnings("SwitchStatementWithTooFewBranches")
     @Override
-    public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType) {
-        switch (itemType) {
-            case BroadcastRuleNodePathProvider.TABLES:
-                return createTableEvent(databaseName, event);
-            default:
-                throw new UnsupportedOperationException(itemType);
-        }
-    }
-    
-    private GovernanceEvent createTableEvent(final String databaseName, final DataChangedEvent event) {
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event) {
         if (Type.ADDED == event.getType()) {
             return new AddBroadcastTableEvent(databaseName, event.getKey(), event.getValue());
         }
@@ -51,9 +37,4 @@ public final class BroadcastRuleChangedEventCreator implements RuleChangedEventC
         }
         return new DeleteBroadcastTableEvent(databaseName);
     }
-    
-    @Override
-    public String getType() {
-        return "broadcast";
-    }
 }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/CompatibleEncryptRuleChangedEventCreator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/CompatibleEncryptRuleChangedEventCreator.java
index 017af48ab9e..8ad9239fc2f 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/CompatibleEncryptRuleChangedEventCreator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/CompatibleEncryptRuleChangedEventCreator.java
@@ -17,15 +17,12 @@
 
 package org.apache.shardingsphere.encrypt.event;
 
-import org.apache.shardingsphere.encrypt.event.compatible.encryptor.AlterCompatibleEncryptorEvent;
-import org.apache.shardingsphere.encrypt.event.compatible.encryptor.DeleteCompatibleEncryptorEvent;
-import org.apache.shardingsphere.encrypt.event.compatible.table.AddCompatibleEncryptTableEvent;
-import org.apache.shardingsphere.encrypt.event.compatible.table.AlterCompatibleEncryptTableEvent;
-import org.apache.shardingsphere.encrypt.event.compatible.table.DeleteCompatibleEncryptTableEvent;
+import org.apache.shardingsphere.encrypt.event.compatible.encryptor.CompatibleEncryptorEventCreator;
+import org.apache.shardingsphere.encrypt.event.compatible.table.CompatibleEncryptTableEventCreator;
 import org.apache.shardingsphere.encrypt.metadata.nodepath.EncryptRuleNodePathProvider;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
 
 /**
@@ -37,33 +34,20 @@ public final class CompatibleEncryptRuleChangedEventCreator implements RuleChang
     
     @Override
     public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType, final String itemName) {
+        return getNamedRuleItemChangedEventCreator(itemType).create(databaseName, itemName, event);
+    }
+    
+    private NamedRuleItemChangedEventCreator getNamedRuleItemChangedEventCreator(final String itemType) {
         switch (itemType) {
             case EncryptRuleNodePathProvider.TABLES:
-                return createTableEvent(databaseName, itemName, event);
+                return new CompatibleEncryptTableEventCreator();
             case EncryptRuleNodePathProvider.ENCRYPTORS:
-                return createEncryptorEvent(databaseName, itemName, event);
+                return new CompatibleEncryptorEventCreator();
             default:
                 throw new UnsupportedOperationException(itemType);
         }
     }
     
-    private GovernanceEvent createTableEvent(final String databaseName, final String groupName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddCompatibleEncryptTableEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterCompatibleEncryptTableEvent(databaseName, groupName, event.getKey(), event.getValue());
-        }
-        return new DeleteCompatibleEncryptTableEvent(databaseName, groupName);
-    }
-    
-    private GovernanceEvent createEncryptorEvent(final String databaseName, final String encryptorName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
-            return new AlterCompatibleEncryptorEvent(databaseName, encryptorName, event.getKey(), event.getValue());
-        }
-        return new DeleteCompatibleEncryptorEvent(databaseName, encryptorName);
-    }
-    
     @Override
     public String getType() {
         return "compatible_encrypt";
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/EncryptRuleChangedEventCreator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/EncryptRuleChangedEventCreator.java
index 78edd849292..d1d19759517 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/EncryptRuleChangedEventCreator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/EncryptRuleChangedEventCreator.java
@@ -17,15 +17,12 @@
 
 package org.apache.shardingsphere.encrypt.event;
 
-import org.apache.shardingsphere.encrypt.event.encryptor.AlterEncryptorEvent;
-import org.apache.shardingsphere.encrypt.event.encryptor.DeleteEncryptorEvent;
-import org.apache.shardingsphere.encrypt.event.table.AddEncryptTableEvent;
-import org.apache.shardingsphere.encrypt.event.table.AlterEncryptTableEvent;
-import org.apache.shardingsphere.encrypt.event.table.DeleteEncryptTableEvent;
+import org.apache.shardingsphere.encrypt.event.encryptor.EncryptorEventCreator;
+import org.apache.shardingsphere.encrypt.event.table.EncryptTableEventCreator;
 import org.apache.shardingsphere.encrypt.metadata.nodepath.EncryptRuleNodePathProvider;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
 
 /**
@@ -35,33 +32,20 @@ public final class EncryptRuleChangedEventCreator implements RuleChangedEventCre
     
     @Override
     public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType, final String itemName) {
+        return getNamedRuleItemChangedEventCreator(itemType).create(databaseName, itemName, event);
+    }
+    
+    private NamedRuleItemChangedEventCreator getNamedRuleItemChangedEventCreator(final String itemType) {
         switch (itemType) {
             case EncryptRuleNodePathProvider.TABLES:
-                return createTableEvent(databaseName, itemName, event);
+                return new EncryptTableEventCreator();
             case EncryptRuleNodePathProvider.ENCRYPTORS:
-                return createEncryptorEvent(databaseName, itemName, event);
+                return new EncryptorEventCreator();
             default:
                 throw new UnsupportedOperationException(itemType);
         }
     }
     
-    private GovernanceEvent createTableEvent(final String databaseName, final String groupName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddEncryptTableEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterEncryptTableEvent(databaseName, groupName, event.getKey(), event.getValue());
-        }
-        return new DeleteEncryptTableEvent(databaseName, groupName);
-    }
-    
-    private GovernanceEvent createEncryptorEvent(final String databaseName, final String encryptorName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
-            return new AlterEncryptorEvent(databaseName, encryptorName, event.getKey(), event.getValue());
-        }
-        return new DeleteEncryptorEvent(databaseName, encryptorName);
-    }
-    
     @Override
     public String getType() {
         return "encrypt";
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/compatible/encryptor/CompatibleEncryptorEventCreator.java
similarity index 51%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/compatible/encryptor/CompatibleEncryptorEventCreator.java
index d6904ccf7d4..80189b44d9a 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/compatible/encryptor/CompatibleEncryptorEventCreator.java
@@ -15,24 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.encrypt.event.compatible.encryptor;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 
 /**
- * Alter load-balance event.
+ * Compatible encryptor event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class CompatibleEncryptorEventCreator implements NamedRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    @Override
+    public GovernanceEvent create(final String databaseName, final String encryptorName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            return new AlterCompatibleEncryptorEvent(databaseName, encryptorName, event.getKey(), event.getValue());
+        }
+        return new DeleteCompatibleEncryptorEvent(databaseName, encryptorName);
+    }
 }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/compatible/table/CompatibleEncryptTableEventCreator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/compatible/table/CompatibleEncryptTableEventCreator.java
new file mode 100644
index 00000000000..22a2caa5845
--- /dev/null
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/compatible/table/CompatibleEncryptTableEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.encrypt.event.compatible.table;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
+
+/**
+ * Compatible encrypt table event creator.
+ */
+public final class CompatibleEncryptTableEventCreator implements NamedRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final String groupName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddCompatibleEncryptTableEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterCompatibleEncryptTableEvent(databaseName, groupName, event.getKey(), event.getValue());
+        }
+        return new DeleteCompatibleEncryptTableEvent(databaseName, groupName);
+    }
+}
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/encryptor/EncryptorEventCreator.java
similarity index 52%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/encryptor/EncryptorEventCreator.java
index d6904ccf7d4..694b143f94c 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/encryptor/EncryptorEventCreator.java
@@ -15,24 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.encrypt.event.encryptor;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 
 /**
- * Alter load-balance event.
+ * Encryptor event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class EncryptorEventCreator implements NamedRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    @Override
+    public GovernanceEvent create(final String databaseName, final String encryptorName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            return new AlterEncryptorEvent(databaseName, encryptorName, event.getKey(), event.getValue());
+        }
+        return new DeleteEncryptorEvent(databaseName, encryptorName);
+    }
 }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/table/EncryptTableEventCreator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/table/EncryptTableEventCreator.java
new file mode 100644
index 00000000000..82ec6598765
--- /dev/null
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/table/EncryptTableEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.encrypt.event.table;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
+
+/**
+ * Encrypt table event creator.
+ */
+public final class EncryptTableEventCreator implements NamedRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final String groupName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddEncryptTableEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterEncryptTableEvent(databaseName, groupName, event.getKey(), event.getValue());
+        }
+        return new DeleteEncryptTableEvent(databaseName, groupName);
+    }
+}
diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/MaskRuleChangedEventCreator.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/MaskRuleChangedEventCreator.java
index 713853bd245..3fae974ebc7 100644
--- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/MaskRuleChangedEventCreator.java
+++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/MaskRuleChangedEventCreator.java
@@ -18,14 +18,11 @@
 package org.apache.shardingsphere.mask.event;
 
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
-import org.apache.shardingsphere.mask.event.algorithm.AlterMaskAlgorithmEvent;
-import org.apache.shardingsphere.mask.event.algorithm.DeleteMaskAlgorithmEvent;
-import org.apache.shardingsphere.mask.event.table.AddMaskTableEvent;
-import org.apache.shardingsphere.mask.event.table.AlterMaskTableEvent;
-import org.apache.shardingsphere.mask.event.table.DeleteMaskTableEvent;
+import org.apache.shardingsphere.mask.event.algorithm.MaskEventCreator;
+import org.apache.shardingsphere.mask.event.table.MaskTableCreator;
 import org.apache.shardingsphere.mask.metadata.nodepath.MaskRuleNodePathProvider;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
 
 /**
@@ -35,33 +32,20 @@ public final class MaskRuleChangedEventCreator implements RuleChangedEventCreato
     
     @Override
     public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType, final String itemName) {
+        return getNamedRuleItemChangedEventCreator(itemType).create(databaseName, itemName, event);
+    }
+    
+    private NamedRuleItemChangedEventCreator getNamedRuleItemChangedEventCreator(final String itemType) {
         switch (itemType) {
             case MaskRuleNodePathProvider.TABLES:
-                return createTableEvent(databaseName, itemName, event);
+                return new MaskTableCreator();
             case MaskRuleNodePathProvider.ALGORITHMS:
-                return createAlgorithmEvent(databaseName, itemName, event);
+                return new MaskEventCreator();
             default:
                 throw new UnsupportedOperationException(itemType);
         }
     }
     
-    private GovernanceEvent createTableEvent(final String databaseName, final String tableName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddMaskTableEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterMaskTableEvent(databaseName, tableName, event.getKey(), event.getValue());
-        }
-        return new DeleteMaskTableEvent(databaseName, tableName);
-    }
-    
-    private GovernanceEvent createAlgorithmEvent(final String databaseName, final String algorithmName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
-            return new AlterMaskAlgorithmEvent(databaseName, algorithmName, event.getKey(), event.getValue());
-        }
-        return new DeleteMaskAlgorithmEvent(databaseName, algorithmName);
-    }
-    
     @Override
     public String getType() {
         return "mask";
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/algorithm/MaskEventCreator.java
similarity index 53%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/algorithm/MaskEventCreator.java
index d6904ccf7d4..3c317a473af 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/algorithm/MaskEventCreator.java
@@ -15,24 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.mask.event.algorithm;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 
 /**
- * Alter load-balance event.
+ * Mask event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class MaskEventCreator implements NamedRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    @Override
+    public GovernanceEvent create(final String databaseName, final String algorithmName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            return new AlterMaskAlgorithmEvent(databaseName, algorithmName, event.getKey(), event.getValue());
+        }
+        return new DeleteMaskAlgorithmEvent(databaseName, algorithmName);
+    }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/table/MaskTableCreator.java
similarity index 50%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/table/MaskTableCreator.java
index d6904ccf7d4..84662af2b8b 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/table/MaskTableCreator.java
@@ -15,24 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.mask.event.table;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 
 /**
- * Alter load-balance event.
+ * Mask table creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class MaskTableCreator implements NamedRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    @Override
+    public GovernanceEvent create(final String databaseName, final String tableName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddMaskTableEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterMaskTableEvent(databaseName, tableName, event.getKey(), event.getValue());
+        }
+        return new DeleteMaskTableEvent(databaseName, tableName);
+    }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleChangedEventCreator.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleChangedEventCreator.java
index cc6fa5390cd..0f4651a43a7 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleChangedEventCreator.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleChangedEventCreator.java
@@ -19,13 +19,10 @@ package org.apache.shardingsphere.readwritesplitting.event;
 
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
-import org.apache.shardingsphere.readwritesplitting.event.datasource.AddReadwriteSplittingDataSourceEvent;
-import org.apache.shardingsphere.readwritesplitting.event.datasource.AlterReadwriteSplittingDataSourceEvent;
-import org.apache.shardingsphere.readwritesplitting.event.datasource.DeleteReadwriteSplittingDataSourceEvent;
-import org.apache.shardingsphere.readwritesplitting.event.loadbalance.AlterLoadBalanceEvent;
-import org.apache.shardingsphere.readwritesplitting.event.loadbalance.DeleteLoadBalanceEvent;
+import org.apache.shardingsphere.readwritesplitting.event.datasource.ReadwriteSplittingDataSourceEventCreator;
+import org.apache.shardingsphere.readwritesplitting.event.loadbalance.ReadwriteSplittingLoadBalancerEventCreator;
 import org.apache.shardingsphere.readwritesplitting.metadata.nodepath.ReadwriteSplittingRuleNodePathProvider;
 
 /**
@@ -35,33 +32,20 @@ public final class ReadwriteSplittingRuleChangedEventCreator implements RuleChan
     
     @Override
     public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType, final String itemName) {
+        return getNamedRuleItemChangedEventCreator(itemType).create(databaseName, itemName, event);
+    }
+    
+    private NamedRuleItemChangedEventCreator getNamedRuleItemChangedEventCreator(final String itemType) {
         switch (itemType) {
             case ReadwriteSplittingRuleNodePathProvider.DATA_SOURCES:
-                return createDataSourceEvent(databaseName, itemName, event);
+                return new ReadwriteSplittingDataSourceEventCreator();
             case ReadwriteSplittingRuleNodePathProvider.LOAD_BALANCERS:
-                return createLoadBalanceEvent(databaseName, itemName, event);
+                return new ReadwriteSplittingLoadBalancerEventCreator();
             default:
                 throw new UnsupportedOperationException(itemType);
         }
     }
     
-    private GovernanceEvent createDataSourceEvent(final String databaseName, final String groupName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddReadwriteSplittingDataSourceEvent(databaseName, groupName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterReadwriteSplittingDataSourceEvent(databaseName, groupName, event.getKey(), event.getValue());
-        }
-        return new DeleteReadwriteSplittingDataSourceEvent(databaseName, groupName);
-    }
-    
-    private GovernanceEvent createLoadBalanceEvent(final String databaseName, final String loadBalancerName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
-            return new AlterLoadBalanceEvent(databaseName, loadBalancerName, event.getKey(), event.getValue());
-        }
-        return new DeleteLoadBalanceEvent(databaseName, loadBalancerName);
-    }
-    
     @Override
     public String getType() {
         return "readwrite_splitting";
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/datasource/ReadwriteSplittingDataSourceEventCreator.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/datasource/ReadwriteSplittingDataSourceEventCreator.java
new file mode 100644
index 00000000000..e87b3c8fc11
--- /dev/null
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/datasource/ReadwriteSplittingDataSourceEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.readwritesplitting.event.datasource;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
+
+/**
+ * Readwrite-splitting data source event creator.
+ */
+public final class ReadwriteSplittingDataSourceEventCreator implements NamedRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final String groupName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddReadwriteSplittingDataSourceEvent(databaseName, groupName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterReadwriteSplittingDataSourceEvent(databaseName, groupName, event.getKey(), event.getValue());
+        }
+        return new DeleteReadwriteSplittingDataSourceEvent(databaseName, groupName);
+    }
+}
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalancerEvent.java
similarity index 92%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalancerEvent.java
index d6904ccf7d4..3f10cdb56da 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalancerEvent.java
@@ -22,11 +22,11 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 
 /**
- * Alter load-balance event.
+ * Alter load-balancer event.
  */
 @RequiredArgsConstructor
 @Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class AlterLoadBalancerEvent implements GovernanceEvent {
     
     private final String databaseName;
     
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalanceEvent.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalancerEvent.java
similarity index 91%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalanceEvent.java
copy to features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalancerEvent.java
index 99397c8b4f0..9892b85e538 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalanceEvent.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalancerEvent.java
@@ -22,11 +22,11 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 
 /**
- * Delete load-balance event.
+ * Delete load-balancer event.
  */
 @RequiredArgsConstructor
 @Getter
-public final class DeleteLoadBalanceEvent implements GovernanceEvent {
+public final class DeleteLoadBalancerEvent implements GovernanceEvent {
     
     private final String databaseName;
     
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/ReadwriteSplittingLoadBalancerEventCreator.java
similarity index 54%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/ReadwriteSplittingLoadBalancerEventCreator.java
index d6904ccf7d4..4483e12e5ae 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/ReadwriteSplittingLoadBalancerEventCreator.java
@@ -17,22 +17,21 @@
 
 package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 
 /**
- * Alter load-balance event.
+ * Readwrite-splitting load-balancer event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class ReadwriteSplittingLoadBalancerEventCreator implements NamedRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    @Override
+    public GovernanceEvent create(final String databaseName, final String loadBalancerName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            return new AlterLoadBalancerEvent(databaseName, loadBalancerName, event.getKey(), event.getValue());
+        }
+        return new DeleteLoadBalancerEvent(databaseName, loadBalancerName);
+    }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingLoadBalanceSubscriber.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingLoadBalanceSubscriber.java
index 56c06085603..3acbb3864a3 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingLoadBalanceSubscriber.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingLoadBalanceSubscriber.java
@@ -29,8 +29,8 @@ import org.apache.shardingsphere.mode.event.config.DatabaseRuleConfigurationChan
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.subsciber.RuleChangedSubscriber;
 import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
-import org.apache.shardingsphere.readwritesplitting.event.loadbalance.AlterLoadBalanceEvent;
-import org.apache.shardingsphere.readwritesplitting.event.loadbalance.DeleteLoadBalanceEvent;
+import org.apache.shardingsphere.readwritesplitting.event.loadbalance.AlterLoadBalancerEvent;
+import org.apache.shardingsphere.readwritesplitting.event.loadbalance.DeleteLoadBalancerEvent;
 import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 
 import java.util.LinkedHashMap;
@@ -55,7 +55,7 @@ public final class ReadwriteSplittingLoadBalanceSubscriber implements RuleChange
      * @param event alter load-balance event
      */
     @Subscribe
-    public synchronized void renew(final AlterLoadBalanceEvent event) {
+    public synchronized void renew(final AlterLoadBalancerEvent event) {
         if (!event.getActiveVersion().equals(instanceContext.getModeContextManager().getActiveVersionByKey(event.getActiveVersionKey()))) {
             return;
         }
@@ -71,7 +71,7 @@ public final class ReadwriteSplittingLoadBalanceSubscriber implements RuleChange
      * @param event delete load-balance event
      */
     @Subscribe
-    public synchronized void renew(final DeleteLoadBalanceEvent event) {
+    public synchronized void renew(final DeleteLoadBalancerEvent event) {
         if (!contextManager.getMetaDataContexts().getMetaData().containsDatabase(event.getDatabaseName())) {
             return;
         }
diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleChangedEventCreator.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleChangedEventCreator.java
index cb0cb9e4ee8..af8399fc981 100644
--- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleChangedEventCreator.java
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleChangedEventCreator.java
@@ -19,18 +19,13 @@ package org.apache.shardingsphere.shadow.event;
 
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
 import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
-import org.apache.shardingsphere.shadow.event.algorithm.AlterDefaultShadowAlgorithmNameEvent;
-import org.apache.shardingsphere.shadow.event.algorithm.AlterShadowAlgorithmEvent;
-import org.apache.shardingsphere.shadow.event.algorithm.DeleteDefaultShadowAlgorithmNameEvent;
-import org.apache.shardingsphere.shadow.event.algorithm.DeleteShadowAlgorithmEvent;
-import org.apache.shardingsphere.shadow.event.datasource.AddShadowDataSourceEvent;
-import org.apache.shardingsphere.shadow.event.datasource.AlterShadowDataSourceEvent;
-import org.apache.shardingsphere.shadow.event.datasource.DeleteShadowDataSourceEvent;
-import org.apache.shardingsphere.shadow.event.table.AddShadowTableEvent;
-import org.apache.shardingsphere.shadow.event.table.AlterShadowTableEvent;
-import org.apache.shardingsphere.shadow.event.table.DeleteShadowTableEvent;
+import org.apache.shardingsphere.shadow.event.algorithm.DefaultShadowAlgorithmEventCreator;
+import org.apache.shardingsphere.shadow.event.algorithm.ShadowAlgorithmEventCreator;
+import org.apache.shardingsphere.shadow.event.datasource.ShadowDataSourceEventCreator;
+import org.apache.shardingsphere.shadow.event.table.ShadowTableEventCreator;
 import org.apache.shardingsphere.shadow.metadata.nodepath.ShadowRuleNodePathProvider;
 
 /**
@@ -40,63 +35,37 @@ public final class ShadowRuleChangedEventCreator implements RuleChangedEventCrea
     
     @Override
     public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType, final String itemName) {
+        return getNamedRuleItemChangedEventCreator(itemType).create(databaseName, itemName, event);
+    }
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType) {
+        return getUniqueRuleItemChangedEventCreator(itemType).create(databaseName, event);
+    }
+    
+    private NamedRuleItemChangedEventCreator getNamedRuleItemChangedEventCreator(final String itemType) {
         switch (itemType) {
             case ShadowRuleNodePathProvider.DATA_SOURCES:
-                return createShadowDataSourceEvent(databaseName, itemName, event);
+                return new ShadowDataSourceEventCreator();
             case ShadowRuleNodePathProvider.TABLES:
-                return createShadowTableEvent(databaseName, itemName, event);
+                return new ShadowTableEventCreator();
             case ShadowRuleNodePathProvider.ALGORITHMS:
-                return createShadowAlgorithmEvent(databaseName, itemName, event);
+                return new ShadowAlgorithmEventCreator();
             default:
                 throw new UnsupportedOperationException(itemType);
         }
     }
     
     @SuppressWarnings("SwitchStatementWithTooFewBranches")
-    @Override
-    public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType) {
+    private UniqueRuleItemChangedEventCreator getUniqueRuleItemChangedEventCreator(final String itemType) {
         switch (itemType) {
-            case ShadowRuleNodePathProvider.DEFAULT_ALGORITHM:
-                return createDefaultShadowAlgorithmNameEvent(databaseName, event);
+            case ShadowRuleNodePathProvider.DATA_SOURCES:
+                return new DefaultShadowAlgorithmEventCreator();
             default:
                 throw new UnsupportedOperationException(itemType);
         }
     }
     
-    private GovernanceEvent createShadowDataSourceEvent(final String databaseName, final String dataSourceName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddShadowDataSourceEvent(databaseName, dataSourceName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterShadowDataSourceEvent(databaseName, dataSourceName, event.getKey(), event.getValue());
-        }
-        return new DeleteShadowDataSourceEvent(databaseName, dataSourceName);
-    }
-    
-    private GovernanceEvent createShadowTableEvent(final String databaseName, final String tableName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddShadowTableEvent(databaseName, tableName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterShadowTableEvent(databaseName, tableName, event.getKey(), event.getValue());
-        }
-        return new DeleteShadowTableEvent(databaseName, tableName);
-    }
-    
-    private GovernanceEvent createShadowAlgorithmEvent(final String databaseName, final String algorithmName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
-            return new AlterShadowAlgorithmEvent(databaseName, algorithmName, event.getKey(), event.getValue());
-        }
-        return new DeleteShadowAlgorithmEvent(databaseName, algorithmName);
-    }
-    
-    private GovernanceEvent createDefaultShadowAlgorithmNameEvent(final String databaseName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
-            return new AlterDefaultShadowAlgorithmNameEvent(databaseName, event.getKey(), event.getValue());
-        }
-        return new DeleteDefaultShadowAlgorithmNameEvent(databaseName);
-    }
-    
     @Override
     public String getType() {
         return "shadow";
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/algorithm/DefaultShadowAlgorithmEventCreator.java
similarity index 52%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/algorithm/DefaultShadowAlgorithmEventCreator.java
index d6904ccf7d4..16023c96d15 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/algorithm/DefaultShadowAlgorithmEventCreator.java
@@ -15,24 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.shadow.event.algorithm;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
 
 /**
- * Alter load-balance event.
+ * Default shadow algorithm event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class DefaultShadowAlgorithmEventCreator implements UniqueRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    @Override
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            return new AlterDefaultShadowAlgorithmNameEvent(databaseName, event.getKey(), event.getValue());
+        }
+        return new DeleteDefaultShadowAlgorithmNameEvent(databaseName);
+    }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/algorithm/ShadowAlgorithmEventCreator.java
similarity index 52%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/algorithm/ShadowAlgorithmEventCreator.java
index d6904ccf7d4..96c8d5d312d 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/algorithm/ShadowAlgorithmEventCreator.java
@@ -15,24 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.shadow.event.algorithm;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 
 /**
- * Alter load-balance event.
+ * Shadow algorithm event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class ShadowAlgorithmEventCreator implements NamedRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    @Override
+    public GovernanceEvent create(final String databaseName, final String algorithmName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            return new AlterShadowAlgorithmEvent(databaseName, algorithmName, event.getKey(), event.getValue());
+        }
+        return new DeleteShadowAlgorithmEvent(databaseName, algorithmName);
+    }
 }
diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/datasource/ShadowDataSourceEventCreator.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/datasource/ShadowDataSourceEventCreator.java
new file mode 100644
index 00000000000..215369dbe20
--- /dev/null
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/datasource/ShadowDataSourceEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.shadow.event.datasource;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
+
+/**
+ * Shadow data source event creator.
+ */
+public final class ShadowDataSourceEventCreator implements NamedRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final String dataSourceName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddShadowDataSourceEvent(databaseName, dataSourceName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterShadowDataSourceEvent(databaseName, dataSourceName, event.getKey(), event.getValue());
+        }
+        return new DeleteShadowDataSourceEvent(databaseName, dataSourceName);
+    }
+}
diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/table/ShadowTableEventCreator.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/table/ShadowTableEventCreator.java
new file mode 100644
index 00000000000..003ef33f786
--- /dev/null
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/table/ShadowTableEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.shadow.event.table;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
+
+/**
+ * Shadow table event creator.
+ */
+public final class ShadowTableEventCreator implements NamedRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final String tableName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddShadowTableEvent(databaseName, tableName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterShadowTableEvent(databaseName, tableName, event.getKey(), event.getValue());
+        }
+        return new DeleteShadowTableEvent(databaseName, tableName);
+    }
+}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleChangedEventCreator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleChangedEventCreator.java
index b445263c9b5..467b0561950 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleChangedEventCreator.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleChangedEventCreator.java
@@ -19,41 +19,21 @@ package org.apache.shardingsphere.sharding.event;
 
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
 import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
-import org.apache.shardingsphere.sharding.event.algorithm.auditor.AlterAuditorEvent;
-import org.apache.shardingsphere.sharding.event.algorithm.auditor.DeleteAuditorEvent;
-import org.apache.shardingsphere.sharding.event.algorithm.keygenerator.AlterKeyGeneratorEvent;
-import org.apache.shardingsphere.sharding.event.algorithm.keygenerator.DeleteKeyGeneratorEvent;
-import org.apache.shardingsphere.sharding.event.algorithm.sharding.AlterShardingAlgorithmEvent;
-import org.apache.shardingsphere.sharding.event.algorithm.sharding.DeleteShardingAlgorithmEvent;
-import org.apache.shardingsphere.sharding.event.cache.AddShardingCacheConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.cache.AlterShardingCacheConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.cache.DeleteShardingCacheConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.audit.AddShardingAuditorStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.audit.AlterShardingAuditorStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.audit.DeleteShardingAuditorStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.database.AddDatabaseShardingStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.database.AlterDatabaseShardingStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.database.DeleteDatabaseShardingStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.keygenerate.AddKeyGenerateStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.keygenerate.AlterKeyGenerateStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.keygenerate.DeleteKeyGenerateStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.shardingcolumn.AddDefaultShardingColumnEvent;
-import org.apache.shardingsphere.sharding.event.strategy.shardingcolumn.AlterDefaultShardingColumnEvent;
-import org.apache.shardingsphere.sharding.event.strategy.shardingcolumn.DeleteDefaultShardingColumnEvent;
-import org.apache.shardingsphere.sharding.event.strategy.table.AddTableShardingStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.table.AlterTableShardingStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.strategy.table.DeleteTableShardingStrategyConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.table.auto.AddShardingAutoTableConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.table.auto.AlterShardingAutoTableConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.table.auto.DeleteShardingAutoTableConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.table.binding.AddShardingTableReferenceConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.table.binding.AlterShardingTableReferenceConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.table.binding.DeleteShardingTableReferenceConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.table.sharding.AddShardingTableConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.table.sharding.AlterShardingTableConfigurationEvent;
-import org.apache.shardingsphere.sharding.event.table.sharding.DeleteShardingTableConfigurationEvent;
+import org.apache.shardingsphere.sharding.event.algorithm.auditor.AuditEventCreator;
+import org.apache.shardingsphere.sharding.event.algorithm.keygenerator.KeyGeneratorEventCreator;
+import org.apache.shardingsphere.sharding.event.algorithm.sharding.ShardingAlgorithmEventCreator;
+import org.apache.shardingsphere.sharding.event.cache.ShardingCacheEventCreator;
+import org.apache.shardingsphere.sharding.event.strategy.audit.ShardingAuditorStrategyEventCreator;
+import org.apache.shardingsphere.sharding.event.strategy.database.DatabaseShardingStrategyEventCreator;
+import org.apache.shardingsphere.sharding.event.strategy.keygenerate.KeyGenerateStrategyEventCreator;
+import org.apache.shardingsphere.sharding.event.strategy.shardingcolumn.DefaultShardingColumnEventCreator;
+import org.apache.shardingsphere.sharding.event.strategy.table.TableShardingStrategyEventCreator;
+import org.apache.shardingsphere.sharding.event.table.auto.ShardingAutoTableEventCreator;
+import org.apache.shardingsphere.sharding.event.table.binding.ShardingTableReferenceEventCreator;
+import org.apache.shardingsphere.sharding.event.table.sharding.ShardingTableEventCreator;
 import org.apache.shardingsphere.sharding.metadata.nodepath.ShardingRuleNodePathProvider;
 
 /**
@@ -63,155 +43,52 @@ public final class ShardingRuleChangedEventCreator implements RuleChangedEventCr
     
     @Override
     public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType, final String itemName) {
+        return getNamedRuleItemChangedEventCreator(itemType).create(databaseName, itemName, event);
+    }
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType) {
+        return getUniqueRuleItemChangedEventCreator(itemType).create(databaseName, event);
+    }
+    
+    private NamedRuleItemChangedEventCreator getNamedRuleItemChangedEventCreator(final String itemType) {
         switch (itemType) {
             case ShardingRuleNodePathProvider.TABLES:
-                return createShardingTableEvent(databaseName, itemName, event);
+                return new ShardingTableEventCreator();
             case ShardingRuleNodePathProvider.AUTO_TABLES:
-                return createShardingAutoTableEvent(databaseName, itemName, event);
+                return new ShardingAutoTableEventCreator();
             case ShardingRuleNodePathProvider.BINDING_TABLES:
-                return createShardingTableReferenceConfigEvent(databaseName, itemName, event);
+                return new ShardingTableReferenceEventCreator();
             case ShardingRuleNodePathProvider.ALGORITHMS:
-                return createShardingAlgorithmEvent(databaseName, itemName, event);
+                return new ShardingAlgorithmEventCreator();
             case ShardingRuleNodePathProvider.KEY_GENERATORS:
-                return createKeyGeneratorEvent(databaseName, itemName, event);
+                return new KeyGeneratorEventCreator();
             case ShardingRuleNodePathProvider.AUDITORS:
-                return createAuditorEvent(databaseName, itemName, event);
+                return new AuditEventCreator();
             default:
                 throw new UnsupportedOperationException(itemType);
         }
     }
     
-    @Override
-    public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType) {
+    private UniqueRuleItemChangedEventCreator getUniqueRuleItemChangedEventCreator(final String itemType) {
         switch (itemType) {
             case ShardingRuleNodePathProvider.DEFAULT_DATABASE_STRATEGY:
-                return createDefaultDatabaseStrategyEvent(databaseName, event);
+                return new DatabaseShardingStrategyEventCreator();
             case ShardingRuleNodePathProvider.DEFAULT_TABLE_STRATEGY:
-                return createDefaultTableStrategyEvent(databaseName, event);
+                return new TableShardingStrategyEventCreator();
             case ShardingRuleNodePathProvider.DEFAULT_KEY_GENERATE_STRATEGY:
-                return createDefaultKeyGenerateStrategyEvent(databaseName, event);
+                return new KeyGenerateStrategyEventCreator();
             case ShardingRuleNodePathProvider.DEFAULT_AUDIT_STRATEGY:
-                return createDefaultShardingAuditorStrategyEvent(databaseName, event);
+                return new ShardingAuditorStrategyEventCreator();
             case ShardingRuleNodePathProvider.DEFAULT_SHARDING_COLUMN:
-                return createDefaultShardingColumnEvent(databaseName, event);
+                return new DefaultShardingColumnEventCreator();
             case ShardingRuleNodePathProvider.SHARDING_CACHE:
-                return createShardingCacheEvent(databaseName, event);
+                return new ShardingCacheEventCreator();
             default:
                 throw new UnsupportedOperationException(itemType);
         }
     }
     
-    private GovernanceEvent createShardingTableEvent(final String databaseName, final String tableName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddShardingTableConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterShardingTableConfigurationEvent(databaseName, tableName, event.getKey(), event.getValue());
-        }
-        return new DeleteShardingTableConfigurationEvent(databaseName, tableName);
-    }
-    
-    private GovernanceEvent createShardingAutoTableEvent(final String databaseName, final String tableName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddShardingAutoTableConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterShardingAutoTableConfigurationEvent(databaseName, tableName, event.getKey(), event.getValue());
-        }
-        return new DeleteShardingAutoTableConfigurationEvent(databaseName, tableName);
-    }
-    
-    private GovernanceEvent createShardingTableReferenceConfigEvent(final String databaseName, final String tableName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddShardingTableReferenceConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterShardingTableReferenceConfigurationEvent(databaseName, tableName, event.getKey(), event.getValue());
-        }
-        return new DeleteShardingTableReferenceConfigurationEvent(databaseName, tableName);
-    }
-    
-    private GovernanceEvent createShardingAlgorithmEvent(final String databaseName, final String algorithmName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
-            return new AlterShardingAlgorithmEvent(databaseName, algorithmName, event.getKey(), event.getValue());
-        }
-        return new DeleteShardingAlgorithmEvent(databaseName, algorithmName);
-    }
-    
-    private GovernanceEvent createKeyGeneratorEvent(final String databaseName, final String algorithmName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
-            return new AlterKeyGeneratorEvent(databaseName, algorithmName, event.getKey(), event.getValue());
-        }
-        return new DeleteKeyGeneratorEvent(databaseName, algorithmName);
-    }
-    
-    private GovernanceEvent createAuditorEvent(final String databaseName, final String algorithmName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
-            return new AlterAuditorEvent(databaseName, algorithmName, event.getKey(), event.getValue());
-        }
-        return new DeleteAuditorEvent(databaseName, algorithmName);
-    }
-    
-    private GovernanceEvent createDefaultDatabaseStrategyEvent(final String databaseName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddDatabaseShardingStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterDatabaseShardingStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        return new DeleteDatabaseShardingStrategyConfigurationEvent(databaseName);
-    }
-    
-    private GovernanceEvent createDefaultTableStrategyEvent(final String databaseName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddTableShardingStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterTableShardingStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        return new DeleteTableShardingStrategyConfigurationEvent(databaseName);
-    }
-    
-    private GovernanceEvent createDefaultKeyGenerateStrategyEvent(final String databaseName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddKeyGenerateStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterKeyGenerateStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        return new DeleteKeyGenerateStrategyConfigurationEvent(databaseName);
-    }
-    
-    private GovernanceEvent createDefaultShardingAuditorStrategyEvent(final String databaseName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddShardingAuditorStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterShardingAuditorStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        return new DeleteShardingAuditorStrategyConfigurationEvent(databaseName);
-    }
-    
-    private GovernanceEvent createDefaultShardingColumnEvent(final String databaseName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddDefaultShardingColumnEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterDefaultShardingColumnEvent(databaseName, event.getKey(), event.getValue());
-        }
-        return new DeleteDefaultShardingColumnEvent(databaseName);
-    }
-    
-    private GovernanceEvent createShardingCacheEvent(final String databaseName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddShardingCacheConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterShardingCacheConfigurationEvent(databaseName, event.getKey(), event.getValue());
-        }
-        return new DeleteShardingCacheConfigurationEvent(databaseName);
-    }
-    
     @Override
     public String getType() {
         return "sharding";
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/algorithm/auditor/AuditEventCreator.java
similarity index 53%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/algorithm/auditor/AuditEventCreator.java
index d6904ccf7d4..72ae118c3ee 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/algorithm/auditor/AuditEventCreator.java
@@ -15,24 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.sharding.event.algorithm.auditor;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 
 /**
- * Alter load-balance event.
+ * Audit event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class AuditEventCreator implements NamedRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    @Override
+    public GovernanceEvent create(final String databaseName, final String algorithmName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            return new AlterAuditorEvent(databaseName, algorithmName, event.getKey(), event.getValue());
+        }
+        return new DeleteAuditorEvent(databaseName, algorithmName);
+    }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/algorithm/keygenerator/KeyGeneratorEventCreator.java
similarity index 52%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/algorithm/keygenerator/KeyGeneratorEventCreator.java
index d6904ccf7d4..9865f16dffe 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/algorithm/keygenerator/KeyGeneratorEventCreator.java
@@ -15,24 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.sharding.event.algorithm.keygenerator;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 
 /**
- * Alter load-balance event.
+ * Key generator event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class KeyGeneratorEventCreator implements NamedRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    @Override
+    public GovernanceEvent create(final String databaseName, final String algorithmName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            return new AlterKeyGeneratorEvent(databaseName, algorithmName, event.getKey(), event.getValue());
+        }
+        return new DeleteKeyGeneratorEvent(databaseName, algorithmName);
+    }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/algorithm/sharding/ShardingAlgorithmEventCreator.java
similarity index 51%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
copy to features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/algorithm/sharding/ShardingAlgorithmEventCreator.java
index d6904ccf7d4..c84a6ee8a83 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/algorithm/sharding/ShardingAlgorithmEventCreator.java
@@ -15,24 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.sharding.event.algorithm.sharding;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
 
 /**
- * Alter load-balance event.
+ * Sharding algorithm event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public final class ShardingAlgorithmEventCreator implements NamedRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    @Override
+    public GovernanceEvent create(final String databaseName, final String algorithmName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            return new AlterShardingAlgorithmEvent(databaseName, algorithmName, event.getKey(), event.getValue());
+        }
+        return new DeleteShardingAlgorithmEvent(databaseName, algorithmName);
+    }
 }
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/cache/ShardingCacheEventCreator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/cache/ShardingCacheEventCreator.java
new file mode 100644
index 00000000000..612e64d5b11
--- /dev/null
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/cache/ShardingCacheEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.event.cache;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
+
+/**
+ * Sharding cache event creator.
+ */
+public final class ShardingCacheEventCreator implements UniqueRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddShardingCacheConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterShardingCacheConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        return new DeleteShardingCacheConfigurationEvent(databaseName);
+    }
+}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/audit/ShardingAuditorStrategyEventCreator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/audit/ShardingAuditorStrategyEventCreator.java
new file mode 100644
index 00000000000..0845200b979
--- /dev/null
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/audit/ShardingAuditorStrategyEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.event.strategy.audit;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
+
+/**
+ * Sharding auditor strategy event creator.
+ */
+public final class ShardingAuditorStrategyEventCreator implements UniqueRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddShardingAuditorStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterShardingAuditorStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        return new DeleteShardingAuditorStrategyConfigurationEvent(databaseName);
+    }
+}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/database/DatabaseShardingStrategyEventCreator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/database/DatabaseShardingStrategyEventCreator.java
new file mode 100644
index 00000000000..65954ffc355
--- /dev/null
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/database/DatabaseShardingStrategyEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.event.strategy.database;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
+
+/**
+ * Database sharding strategy event creator.
+ */
+public final class DatabaseShardingStrategyEventCreator implements UniqueRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddDatabaseShardingStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterDatabaseShardingStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        return new DeleteDatabaseShardingStrategyConfigurationEvent(databaseName);
+    }
+}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/keygenerate/KeyGenerateStrategyEventCreator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/keygenerate/KeyGenerateStrategyEventCreator.java
new file mode 100644
index 00000000000..98924370492
--- /dev/null
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/keygenerate/KeyGenerateStrategyEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.event.strategy.keygenerate;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
+
+/**
+ * Key generate strategy event creator.
+ */
+public final class KeyGenerateStrategyEventCreator implements UniqueRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddKeyGenerateStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterKeyGenerateStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        return new DeleteKeyGenerateStrategyConfigurationEvent(databaseName);
+    }
+}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/shardingcolumn/DefaultShardingColumnEventCreator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/shardingcolumn/DefaultShardingColumnEventCreator.java
new file mode 100644
index 00000000000..9243f4f820a
--- /dev/null
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/shardingcolumn/DefaultShardingColumnEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.event.strategy.shardingcolumn;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
+
+/**
+ * Default sharding column event creator.
+ */
+public final class DefaultShardingColumnEventCreator implements UniqueRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddDefaultShardingColumnEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterDefaultShardingColumnEvent(databaseName, event.getKey(), event.getValue());
+        }
+        return new DeleteDefaultShardingColumnEvent(databaseName);
+    }
+}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/table/TableShardingStrategyEventCreator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/table/TableShardingStrategyEventCreator.java
new file mode 100644
index 00000000000..29c831476b3
--- /dev/null
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/strategy/table/TableShardingStrategyEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.event.strategy.table;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
+
+/**
+ * Table sharding strategy event creator.
+ */
+public final class TableShardingStrategyEventCreator implements UniqueRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddTableShardingStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterTableShardingStrategyConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        return new DeleteTableShardingStrategyConfigurationEvent(databaseName);
+    }
+}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/table/auto/ShardingAutoTableEventCreator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/table/auto/ShardingAutoTableEventCreator.java
new file mode 100644
index 00000000000..e627d7f1bcc
--- /dev/null
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/table/auto/ShardingAutoTableEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.event.table.auto;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
+
+/**
+ * Sharding auto table event creator.
+ */
+public final class ShardingAutoTableEventCreator implements NamedRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final String tableName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddShardingAutoTableConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterShardingAutoTableConfigurationEvent(databaseName, tableName, event.getKey(), event.getValue());
+        }
+        return new DeleteShardingAutoTableConfigurationEvent(databaseName, tableName);
+    }
+}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/table/binding/ShardingTableReferenceEventCreator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/table/binding/ShardingTableReferenceEventCreator.java
new file mode 100644
index 00000000000..7438b133e68
--- /dev/null
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/table/binding/ShardingTableReferenceEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.event.table.binding;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
+
+/**
+ * Sharding table reference creator.
+ */
+public final class ShardingTableReferenceEventCreator implements NamedRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final String tableName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddShardingTableReferenceConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterShardingTableReferenceConfigurationEvent(databaseName, tableName, event.getKey(), event.getValue());
+        }
+        return new DeleteShardingTableReferenceConfigurationEvent(databaseName, tableName);
+    }
+}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/table/sharding/ShardingTableEventCreator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/table/sharding/ShardingTableEventCreator.java
new file mode 100644
index 00000000000..48d271cfc64
--- /dev/null
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/table/sharding/ShardingTableEventCreator.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.event.table.sharding;
+
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
+
+/**
+ * Sharding table event creator.
+ */
+public final class ShardingTableEventCreator implements NamedRuleItemChangedEventCreator {
+    
+    @Override
+    public GovernanceEvent create(final String databaseName, final String tableName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return new AddShardingTableConfigurationEvent(databaseName, event.getKey(), event.getValue());
+        }
+        if (Type.UPDATED == event.getType()) {
+            return new AlterShardingTableConfigurationEvent(databaseName, tableName, event.getKey(), event.getValue());
+        }
+        return new DeleteShardingTableConfigurationEvent(databaseName, tableName);
+    }
+}
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleChangedEventCreator.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleChangedEventCreator.java
index 6fdeec2e278..f2e4d5e59df 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleChangedEventCreator.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleChangedEventCreator.java
@@ -19,11 +19,9 @@ package org.apache.shardingsphere.single.event;
 
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
 import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
-import org.apache.shardingsphere.single.event.config.AddSingleTableEvent;
-import org.apache.shardingsphere.single.event.config.AlterSingleTableEvent;
-import org.apache.shardingsphere.single.event.config.DeleteSingleTableEvent;
+import org.apache.shardingsphere.single.event.config.SingleTableEventCreator;
 import org.apache.shardingsphere.single.metadata.nodepath.SingleRuleNodePathProvider;
 
 /**
@@ -31,27 +29,21 @@ import org.apache.shardingsphere.single.metadata.nodepath.SingleRuleNodePathProv
  */
 public final class SingleRuleChangedEventCreator implements RuleChangedEventCreator {
     
-    @SuppressWarnings("SwitchStatementWithTooFewBranches")
     @Override
     public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType) {
+        return getUniqueRuleItemChangedEventCreator(itemType).create(databaseName, event);
+    }
+    
+    @SuppressWarnings("SwitchStatementWithTooFewBranches")
+    private UniqueRuleItemChangedEventCreator getUniqueRuleItemChangedEventCreator(final String itemType) {
         switch (itemType) {
             case SingleRuleNodePathProvider.TABLES:
-                return createTableEvent(databaseName, event);
+                return new SingleTableEventCreator();
             default:
                 throw new UnsupportedOperationException(itemType);
         }
     }
     
-    private GovernanceEvent createTableEvent(final String databaseName, final DataChangedEvent event) {
-        if (Type.ADDED == event.getType()) {
-            return new AddSingleTableEvent(databaseName, event.getKey(), event.getValue());
-        }
-        if (Type.UPDATED == event.getType()) {
-            return new AlterSingleTableEvent(databaseName, event.getKey(), event.getValue());
-        }
-        return new DeleteSingleTableEvent(databaseName);
-    }
-    
     @Override
     public String getType() {
         return "single";
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleChangedEventCreator.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/SingleTableEventCreator.java
similarity index 56%
copy from kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleChangedEventCreator.java
copy to kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/SingleTableEventCreator.java
index 6fdeec2e278..ebf402f44eb 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleChangedEventCreator.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/SingleTableEventCreator.java
@@ -15,34 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.event;
+package org.apache.shardingsphere.single.event.config;
 
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
-import org.apache.shardingsphere.mode.spi.RuleChangedEventCreator;
-import org.apache.shardingsphere.single.event.config.AddSingleTableEvent;
-import org.apache.shardingsphere.single.event.config.AlterSingleTableEvent;
-import org.apache.shardingsphere.single.event.config.DeleteSingleTableEvent;
-import org.apache.shardingsphere.single.metadata.nodepath.SingleRuleNodePathProvider;
+import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
 
 /**
- * Single rule changed event creator.
+ * Single table event creator.
  */
-public final class SingleRuleChangedEventCreator implements RuleChangedEventCreator {
+public final class SingleTableEventCreator implements UniqueRuleItemChangedEventCreator {
     
-    @SuppressWarnings("SwitchStatementWithTooFewBranches")
     @Override
-    public GovernanceEvent create(final String databaseName, final DataChangedEvent event, final String itemType) {
-        switch (itemType) {
-            case SingleRuleNodePathProvider.TABLES:
-                return createTableEvent(databaseName, event);
-            default:
-                throw new UnsupportedOperationException(itemType);
-        }
-    }
-    
-    private GovernanceEvent createTableEvent(final String databaseName, final DataChangedEvent event) {
+    public GovernanceEvent create(final String databaseName, final DataChangedEvent event) {
         if (Type.ADDED == event.getType()) {
             return new AddSingleTableEvent(databaseName, event.getKey(), event.getValue());
         }
@@ -51,9 +37,4 @@ public final class SingleRuleChangedEventCreator implements RuleChangedEventCrea
         }
         return new DeleteSingleTableEvent(databaseName);
     }
-    
-    @Override
-    public String getType() {
-        return "single";
-    }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/NamedRuleItemChangedEventCreator.java
similarity index 65%
rename from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
rename to mode/api/src/main/java/org/apache/shardingsphere/mode/event/NamedRuleItemChangedEventCreator.java
index d6904ccf7d4..9a060591b90 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
+++ b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/NamedRuleItemChangedEventCreator.java
@@ -15,24 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.mode.event;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 
 /**
- * Alter load-balance event.
+ * Named rule item changed event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AlterLoadBalanceEvent implements GovernanceEvent {
+public interface NamedRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
+    /**
+     * Create named rule item changed event.
+     * 
+     * @param databaseName database name
+     * @param itemName item name
+     * @param event data changed event
+     * @return named rule item changed event
+     */
+    GovernanceEvent create(String databaseName, String itemName, DataChangedEvent event);
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalanceEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/UniqueRuleItemChangedEventCreator.java
similarity index 68%
rename from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalanceEvent.java
rename to mode/api/src/main/java/org/apache/shardingsphere/mode/event/UniqueRuleItemChangedEventCreator.java
index 99397c8b4f0..65f4c561bff 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalanceEvent.java
+++ b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/UniqueRuleItemChangedEventCreator.java
@@ -15,20 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
+package org.apache.shardingsphere.mode.event;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 
 /**
- * Delete load-balance event.
+ * Unique rule item changed event creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class DeleteLoadBalanceEvent implements GovernanceEvent {
+public interface UniqueRuleItemChangedEventCreator {
     
-    private final String databaseName;
-    
-    private final String loadBalanceName;
+    /**
+     * Create named rule item changed event.
+     * 
+     * @param databaseName database name
+     * @param event data changed event
+     * @return named rule item changed event
+     */
+    GovernanceEvent create(String databaseName, DataChangedEvent event);
 }